1
我有一个工厂在接收消息到达时创建消息处理程序。消息处理程序需要几个依赖关系 - 一个基于传入消息选择的配置对象和其他基础结构组件。Autofac - 如何实现使用运行时信息的工厂?
我使用Autofac和委托,并且遇到了麻烦,请避免将MessageHandlerFactory耦合到特定的实现类。
这里是我已经能够注入的代表进厂的唯一途径:
// Handler defines a delegate that Autofac turns into a factory method
public class FtpMessageHandler : IFtpMessageHandler {
public delegate FtpMessageHandler Factory (Configuration configuration);
public FtpMessageHandler(Configuration configuration,
S3Facade s3Facade,
.... other dependencies.....
)
....
}
// In Autofac module..
// This is how I'd like to register the component, but it does NOT
// work - Autofac fails to resolve the delegate
builder.RegisterType<FtpMessageHandler>().As<IFtpMessageHandler>();
// This is what DOES work
builder.RegisterType<FtpMessageHandler>();
public class MessageHandlerFactory {
public FtpMessageHandler.Factory FtpMessageHandlerFactory { get; }
...
public MessageHandlerFactory(FtpMessageHandler.Factory ftpMessageHandlerFactory, ....)
FtpMessageHandlerFactory = ftpMessageHandlerFactory;
)
public IMessageHandler GetMessageHandler(MessageTypeEnum type, Configuration config) {
if (type == MessageTypeEnum.FTP)
return FtpMessageHandlerFactory.Invoke(config);
....
)
}
所以......这个作品,一种时尚了。
但我不喜欢将具体类型注入MessageHandlerFactory。例如,这会排除使用IMessageHandler上的装饰器而不修改工厂。
有没有更好的方法来做到这一点?
防止不必运行时间数据注入applicatino组件所描述的方法。这是[反模式](https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=99)。 – Steven
好点。在我当前的解决方案中,运行时数据在创建对象后被馈送到方法中。 –