C# 如何以干净的方式解析处理程序

C# 如何以干净的方式解析处理程序,c#,dependency-injection,dependency-resolver,C#,Dependency Injection,Dependency Resolver,我试图找到一种简单的方法来解决我的处理程序。解决方案是处理不同类型的消息。但是我找到的每个解决方案,比如,我都坚持解析处理程序,因为我的处理程序有一个构造函数,它与其他接口有一些依赖关系 例如,如果我遵循上述想法,我的OrderMessageHandler是 然而,IInterface还有其他依赖项,我不能简单地解决这个问题。 我想知道是否有人有比下面这个更好的主意 public class MessageProcessor { private List<IMessageHandl

我试图找到一种简单的方法来解决我的处理程序。解决方案是处理不同类型的消息。但是我找到的每个解决方案,比如,我都坚持解析处理程序,因为我的处理程序有一个构造函数,它与其他接口有一些依赖关系

例如,如果我遵循上述想法,我的OrderMessageHandler是

然而,IInterface还有其他依赖项,我不能简单地解决这个问题。 我想知道是否有人有比下面这个更好的主意

public class MessageProcessor {
    private List<IMessageHandler> handlers;

    public MessageProcessor() {
       handlers = new List<IMessageHandler>();
       handlers.add(new SomeOtherMessageHandler());
       handlers.add(new OrderMessageHandler());
    }

    public void ProcessMessage( IMessage msg ) {
       bool messageWasHandled
       foreach( IMessageHandler handler in handlers ) {
           if ( handler.HandleMessage(msg) ) {
               messageWasHandled = true;
               break;
           }
       }

       if ( !messageWasHandled ) {
          // Do some default processing, throw error, whatever.
       }
    }
}
接下来,您可以确保所有必要的依赖项都被注入其中

public class MessageProcessor {
    private List<IMessageHandler> handlers;

    public MessageProcessor(IEnumerable<IMessageHandler> handlers) {
        this.handlers = new List<IMessageHandler>(handlers);
        //removed
        //handlers.add(new SomeOtherMessageHandler()); 
        //handlers.add(new OrderMessageHandler());
    }

    public void ProcessMessage( IMessage msg ) {
       bool messageWasHandled
       foreach( IMessageHandler handler in handlers ) {
           if ( handler.HandleMessage(msg) ) {
               messageWasHandled = true;
               break;
           }
       }

       if ( !messageWasHandled ) {
          // Do some default processing, throw error, whatever.
       }
    }
}
如果使用DI容器,请确保注册所有相关方

伪代码:

这样,容器就知道在解析所需类型时如何构建对象图

MessageProcessor processor = container.Resolve<MessageProcessor>();

processor.ProcessMessage(...);

//...
如果使用它,仍然可以在需要的地方正确创建和注入所有涉及的类型

IInterface dependency = new Implementation();
List<IMessageHandler> handlers = new List<IMessageHandler>();
handlers.Add(new SomeOtherMessageHandler()); 
handlers.Add(new OrderMessageHandler(dependency));
MessageProcessor processor = new MessageProcessor(handlers);

processor.ProcessMessage(...);

//...
接下来,您可以确保所有必要的依赖项都被注入其中

public class MessageProcessor {
    private List<IMessageHandler> handlers;

    public MessageProcessor(IEnumerable<IMessageHandler> handlers) {
        this.handlers = new List<IMessageHandler>(handlers);
        //removed
        //handlers.add(new SomeOtherMessageHandler()); 
        //handlers.add(new OrderMessageHandler());
    }

    public void ProcessMessage( IMessage msg ) {
       bool messageWasHandled
       foreach( IMessageHandler handler in handlers ) {
           if ( handler.HandleMessage(msg) ) {
               messageWasHandled = true;
               break;
           }
       }

       if ( !messageWasHandled ) {
          // Do some default processing, throw error, whatever.
       }
    }
}
如果使用DI容器,请确保注册所有相关方

伪代码:

这样,容器就知道在解析所需类型时如何构建对象图

MessageProcessor processor = container.Resolve<MessageProcessor>();

processor.ProcessMessage(...);

//...
如果使用它,仍然可以在需要的地方正确创建和注入所有涉及的类型

IInterface dependency = new Implementation();
List<IMessageHandler> handlers = new List<IMessageHandler>();
handlers.Add(new SomeOtherMessageHandler()); 
handlers.Add(new OrderMessageHandler(dependency));
MessageProcessor processor = new MessageProcessor(handlers);

processor.ProcessMessage(...);

//...

您是否尝试过将IMessageHandler接口设置为通用接口,例如IMessageHandler?这是一种非常常见的方法,将消除您当前正在进行的所有类型检查。@Steven我这样做了。我的主要问题是这个消息处理器以一种干净、简单的方式找到正确的处理程序。我解决了它,但它似乎非常复杂,缺乏可读性。我使用了Activator.CreateInstance,甚至通过调用。我不满意你有没有尝试过让你的IMessageHandler接口通用化,例如IMessageHandler?这是一种非常常见的方法,将消除您当前正在进行的所有类型检查。@Steven我这样做了。我的主要问题是这个消息处理器以一种干净、简单的方式找到正确的处理程序。我解决了它,但它似乎非常复杂,缺乏可读性。我使用了Activator.CreateInstance,甚至通过调用。我不喜欢那些