1

我试图让自己熟悉,MVC3autofac我遇到了我无法解决的小问题。

我正在使用autofac集成MVC3并且一切正常,页面加载正确,依赖项被注入,这很酷。困扰我的是如何在类库项目中使用autofac'sContainerMVC's 。 我正在尝试创建静态类来帮助我处理域事件。我只是希望能够使用事件参数调用该方法,并且一切都应该由此类处理。这是代码: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' session),而其他依赖项注册为InstancePerDependencyor SingleInstance。因此,当我尝试container在我的 UI 项目中使用 created 时,我得到了没有httpRequest可用标签的异常。

我如何重用Container在 web 项目中创建的来访问它的所有功能,包括InstancePerHttpRequesthttpRequest标签?

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

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

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

4

1 回答 1

0

您不应该直接从您的应用程序代码中引用您的容器。这看起来像服务定位器反模式。正确的做法是向您的对象传递他们完成工作所需的服务,通常通过构造函数参数完成。但是...如果您要坚持依赖全局静态,那么至少将模型建模EventManager为单例,这样用法如下所示:

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

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

于 2012-07-12T18:54:23.500 回答