我正在努力让自己熟悉MVC3
和autofac
,但我遇到了一个小问题,我无法解决问题。
我正在使用与autofac
集成的MVC3
,一切正常,页面正确加载,正在注入依赖项,这很酷。让我烦恼的是如何在课程库项目中使用autofac
的{{1}}或Container
的{{1}}。
我正在尝试创建可以帮助我处理域事件的静态类。我只是希望能够使用事件参数调用该方法,并且所有内容都应该由此类进行处理。这是代码:
MVC
正如您所看到的那样,它非常简单,如果不是DependencyResover
方法,一切都会很好。我的一些依赖项注册为public static IContainer Container { get; set; }
public static void Raise<T>(T e) where T : IDomainEvent
{
foreach (var eventHandler in DomainEventManager.Container.Resolve<IEnumerable<EventHandlers.Handles<T>>>())
{
eventHandler.Handle(e);
}
}
(MVC
'会话),而其他依赖项注册为InstancePerHttpRequest
或NHibernate
。因此,当我尝试使用在我的UI项目中创建的InstancePerDependency
时,我发现没有SingleInstance
标记可用。
如何重复使用在Web项目中创建的container
来访问其所有功能,包括httpRequest
和Container
代码?
或许我的问题还有其他解决办法吗?我正在考虑使用委托函数来获取事件处理程序,但我不能(可以吗?)创建通用委托,我不需要在赋值时使用具体类型进行初始化。
为什么我想使用静态类来执行此操作基本上每个InstancePerHttpRequest
和httpRequest
或entity
都需要能够引发域事件。将aggregate
注入其中每一个都很麻烦,静态类正是解决我所有问题的原因。
如果有人能帮助我解决这个问题,我将不胜感激 干杯,Pako
答案 0 :(得分:0)
您不应直接从应用代码引用容器。这看起来像Service Locator反模式。正确的操作是将对象传递给他们完成工作所需的服务,通常是通过构造函数参数完成的。但是......如果你要坚持依赖全局静态,那么至少将模型EventManager
作为一个单例,这样使用看起来像:
EventManager.Current.Raise<SomeEvent>(someObject);
然后您可以在初始化应用时将EventManager.Current
设置为正确构造的实例。