2012-07-12 25 views
1

我试图让自己熟悉MVC3autofac,但我遇到了我在遇到麻烦解决小问题。使用集装箱/ DependencyResolver其他DLL

我正在使用autofacMVC3集成,并且都运行良好,页面加载正确,依赖关系正在被注入,这很酷。什么是窃听我是如何利用autofacContainerMVCDependencyResover在类库项目。
我正在尝试创建静态类,它将帮助我处理域事件。我只是希望能够调用具有事件参数的方法,并且应该由这个类来处理所有事情。这里是代码:

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方法。我的一些依赖是registeres为InstancePerHttpRequestNHibernate“会议),而其他注册为InstancePerDependencySingleInstance。因此,当我尝试使用在我的UI项目中创建的container时,我发现没有httpRequest标签可用。

如何重用在web项目中创建的Container以访问其所有功能,包括InstancePerHttpRequesthttpRequest标记?

或者,也许还有其他的解决我的问题?我正在考虑使用委托函数来获取事件处理程序,但我不能(我可以吗?)创建通用委托,我不需要在赋值时使用具体类型进行初始化。

为什么我要用静态类来做这个基本上每个entityaggregateservice都需要能够引发域事件。将EventManager注入其中每一个都会很麻烦,静态类正是解决我所有问题的方法。

如果有人可以帮助我让我的周围的头,我将不胜感激。
干杯,Pako

回答

0

你不应该直接从你的应用程序代码引用你的容器。这看起来像Service Locator反模式。正确的操作是将您的对象传递给他们完成工作所需的服务,通常通过构造函数参数完成。但是...如果你要坚持取决于全球静态的,那么至少模型EventManager作为一个单身,使得在使用看起来像:

EventManager.Current.Raise<SomeEvent>(someObject); 

,然后你可以设置EventManager.Current等于正确在您的应用程序初始化时构建实例。

+0

我同意你的看法,通常你不应该做这样的事情,然而这,可以说,特殊情况。将这个类注入到我的域中的每个对象将会很麻烦。创建'singleton'与创建静态类似乎没有太大区别,我认为它与获取静态类的事件处理函数时会有同样的问题,它会抛出异常,导致'httpRequest'标记不存在。 – Pako 2012-07-13 08:58:48

+0

单例和静态类的区别在于,单例允许你在自动化测试中用更可测试/可嘲讽的版本替换实例。 – 2012-07-13 12:56:58

+0

至于httpRequest标签部分,如果您打算在非Web上下文中使用同一个确切的容器,则不要使用InstancePerHttpRequest注册您的服务。我通常使用InstancePerLifetimeScope(),它的功能与IPHR相同,除非你明确地创建自己的Lifetimecopes。 – 2012-07-13 12:59:27