C#控制台应用程序完成依赖注入,实现简单的发布-订阅模式
引包
引入Nuget包
1.MediatR
2.Mediatr.extensions.microsoft.dependencyinjection
发布者接口
public interface IPublisher
{
Task Publish(UserMessage message);
}
发布者实现类
public class Publisher : IPublisher
{
private readonly IMediator _mediator;
public Publisher(IMediator mediator)
{
_mediator = mediator;
}
public async Task Publish(UserMessage message)
{
_mediator.Publish(message);
}
}
发布内容
内容必须继承INotification 接口
public class User
{
public int Name { get; set; }
//[Required]
public int Age { get; set; }
//[DataType(DataType.Date)]
public int Id { get; set; }
public DateTime CreatedAt { get; set; }
public override string? ToString()
{
return
$"ID:{this.Id};" +
$"Age:{this.Age};" +
$"Name:{this.Name};";
}
}
public class UserMessage : INotification
{
public User User { get; set; }
public Operation operation { get; set; }
public override string? ToString()
{
return
User.ToString() +
operation.ToString();
}
}
订阅者
订阅者可以同时有多个订阅者。
public class Subscriber : INotificationHandler<UserMessage>
{
public Task Handle(UserMessage notification, CancellationToken cancellationToken)
{
Console.WriteLine( $" 收到{notification};" );
return Task.CompletedTask;
}
}
依赖注入
新建抽象类BaseConsole.cs类用来实现依赖注入;
public abstract class BaseConsole
{
public IServiceProvider _ServiceProvider { get; set; }
protected abstract void ConfigureServices(IServiceCollection service);
public void Run()
{
Initialize();
}
public void Initialize()
{
var service = new ServiceCollection();
// 配置依赖注入
ConfigureServices(service);
_ServiceProvider = service.BuildServiceProvider();
}
}
新建实现类App.cs类;
public class App : BaseConsole
{
//重写父类方法,完成依赖注入
protected override void ConfigureServices(IServiceCollection service)
{
service.AddSingleton<IPublisher, Publisher>();
service.AddMediatR(Assembly.GetExecutingAssembly());
// service.AddMediatR(Assembly.GetExecutingAssembly());这句代码会自动注入实现了INotificationHandler的类和
实现了INotification的类,因此不需要想下面这样多余的注入。
//service.AddSingleton<INotificationHandler<UserMessage>, Subscriber>();
}
public async void Send()
{
var publisher = _ServiceProvider.GetService<IPublisher>();
var user = new User()
{
Name = 18,
Age = 199,
CreatedAt = DateTime.UtcNow,
Id = 123,
};
publisher.Publish(new UserMessage()
{
User = user,
operation = Operation.Add,
});
}
}
运行程序
using EventHandleDemo;
App app = new App();
app.Run();
app.Send();