在其他dll中使用Container / DependencyResolver

时间:2012-07-12 08:07:53

标签: asp.net-mvc-3 autofac

我正在努力让自己熟悉MVC3autofac,但我遇到了一个小问题,我无法解决问题。

我正在使用与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'会话),而其他依赖项注册为InstancePerHttpRequestNHibernate。因此,当我尝试使用在我的UI项目中创建的InstancePerDependency时,我发现没有SingleInstance标记可用。

如何重复使用在Web项目中创建的container来访问其所有功能,包括httpRequestContainer代码?

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

为什么我想使用静态类来执行此操作基本上每个InstancePerHttpRequesthttpRequestentity都需要能够引发域事件。将aggregate注入其中每一个都很麻烦,静态类正是解决我所有问题的原因。

如果有人能帮助我解决这个问题,我将不胜感激 干杯,Pako

1 个答案:

答案 0 :(得分:0)

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

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

然后您可以在初始化应用时将EventManager.Current设置为正确构造的实例。