C#控制台应用程序完成依赖注入,实现简单的发布-订阅模式

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();

运行结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值