在其他dll中使用Container/DependencyResolver



我正在努力熟悉MVC3autofac,但遇到了一些小问题,我很难解决。

我使用的是与MVC3集成的autofac,一切都很好,页面加载正确,依赖项被注入,这很酷。困扰我的是如何在类库项目中使用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方法,一切都会很好。我的一些依赖项注册为InstancePerHttpRequestNHibernate'会话),而其他依赖项则注册为InstancePerDependencySingleInstance。因此,当我尝试使用在UI项目中创建的container时,我会遇到一个异常,即没有可用的httpRequest标记。

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

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

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

如果有人能帮我理清思路,我将不胜感激
干杯,巴基斯坦

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

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

然后您可以在初始化应用程序时将CCD_ 24设置为一个正确构造的实例。

最新更新