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