Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于IoC的事件调度库_C#_Events_Nuget_Inversion Of Control - Fatal编程技术网

C# 基于IoC的事件调度库

C# 基于IoC的事件调度库,c#,events,nuget,inversion-of-control,C#,Events,Nuget,Inversion Of Control,在过去,我构建了一个MessageDispatcher组件,该组件扫描程序集,查找用特定属性修饰的类型,并初始化每个类型的实例。然后,当任何对象被馈送到MessageDispatcher实例时,包含签名包含传递对象类型的方法的每个先前初始化的实例都会使用指定参数触发所述方法。例如,在以下场景中: [Listener] public class MyListener { MessageDispatcher _dispatcher; //Assigned elsewhere [Me

在过去,我构建了一个
MessageDispatcher
组件,该组件扫描程序集,查找用特定属性修饰的类型,并初始化每个类型的实例。然后,当任何对象被馈送到
MessageDispatcher
实例时,包含签名包含传递对象类型的方法的每个先前初始化的实例都会使用指定参数触发所述方法。例如,在以下场景中:

[Listener]
public class MyListener
{
    MessageDispatcher _dispatcher; //Assigned elsewhere

    [MessageListener]
    public async Task DoSomething(int value)
    {
        var otherValue = await _dispatcher.Next<string>();
        Console.WriteLine($"{value} is {otherValue}.");
    }
}
我想知道是否有专门提供或包含此类服务的图书馆。它必须能够:

  • 扫描程序集并基于属性初始化类型
  • 动态“订阅”某些类型
  • “Wait”表示要从调度器中抽取的值(如我的示例中的
    Next
    方法)
(由于SO规则不允许使用库建议,因此这里尝试使用实现来回答)

事实上,任何国际奥委会都可以做到这一点。他们所需要的只是能够使用属性或其他常规方式注册服务

至于消息调度。只需创建一个像
IMessageHandler
这样的接口。在所有应该处理消息的类上实现它

例如:

public interface IMessageHandler<TMessage>
{
    void Handle(TMessage msg);
}

public class SomeService : IMessageHandler<UserCreated>
{
    //[.. all other methods ..]

    public void Handle(UserCreated msg)
    {
        // ...
    }
}
但是,这不允许您动态订阅所需内容。如果仅仅忽略不需要的消息是不可行的。那么这个答案不适合您。

(由于SO规则不允许使用库建议,因此这里尝试使用实现来回答)

事实上,任何国际奥委会都可以做到这一点。他们所需要的只是能够使用属性或其他常规方式注册服务

至于消息调度。只需创建一个像
IMessageHandler
这样的接口。在所有应该处理消息的类上实现它

例如:

public interface IMessageHandler<TMessage>
{
    void Handle(TMessage msg);
}

public class SomeService : IMessageHandler<UserCreated>
{
    //[.. all other methods ..]

    public void Handle(UserCreated msg)
    {
        // ...
    }
}
但是,这不允许您动态订阅所需内容。如果仅仅忽略不需要的消息是不可行的。那么这个答案不适合你

public interface IMessageDispatcher
{
    void Dispatch<TMessage>(TMessage msg);
}

// The actual implementation differs
// depending on your choice of container.
public class ContainerBasedMessageDispatcher : IMessageDispatcher
{
    Container _container;

    public ContainerBasedMessageDispatcher(Container container)
    {
        _container = container;
    }
    public void Dispatch<TMessage>(TMessage message)
    {
        using (var scope = container.BeginLifetimeScope())
        {
            var handlers = scope.Resolve<IEnumerable<IMessageHandler<TMessage>>();
            foreach (var handler in handlers)
            {
                handler.Handle(message);
            }
        }
    }
}
public class UserService
{
   IMessageDispatcher _dispatcher;

   public UserService(IMessageDispatcher dispatcher)
   {
       _dispatcher = dispatcher;
   }

   public void Create(User user)
   {
       //[...]


       _dispatcher.Dispatch(new UserCreated(user.Id));
   }
}