我试图让自己熟悉MVC3
和autofac
,但我遇到了我在遇到麻烦解决小问题。使用集装箱/ DependencyResolver其他DLL
我正在使用autofac
与MVC3
集成,并且都运行良好,页面加载正确,依赖关系正在被注入,这很酷。什么是窃听我是如何利用autofac
的Container
或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
方法。我的一些依赖是registeres为InstancePerHttpRequest
(NHibernate
“会议),而其他注册为InstancePerDependency
或SingleInstance
。因此,当我尝试使用在我的UI项目中创建的container
时,我发现没有httpRequest
标签可用。
如何重用在web项目中创建的Container
以访问其所有功能,包括InstancePerHttpRequest
和httpRequest
标记?
或者,也许还有其他的解决我的问题?我正在考虑使用委托函数来获取事件处理程序,但我不能(我可以吗?)创建通用委托,我不需要在赋值时使用具体类型进行初始化。
为什么我要用静态类来做这个基本上每个entity
和aggregate
或service
都需要能够引发域事件。将EventManager
注入其中每一个都会很麻烦,静态类正是解决我所有问题的方法。
如果有人可以帮助我让我的周围的头,我将不胜感激。
干杯,Pako
我同意你的看法,通常你不应该做这样的事情,然而这,可以说,特殊情况。将这个类注入到我的域中的每个对象将会很麻烦。创建'singleton'与创建静态类似乎没有太大区别,我认为它与获取静态类的事件处理函数时会有同样的问题,它会抛出异常,导致'httpRequest'标记不存在。 – Pako 2012-07-13 08:58:48
单例和静态类的区别在于,单例允许你在自动化测试中用更可测试/可嘲讽的版本替换实例。 – 2012-07-13 12:56:58
至于httpRequest标签部分,如果您打算在非Web上下文中使用同一个确切的容器,则不要使用InstancePerHttpRequest注册您的服务。我通常使用InstancePerLifetimeScope(),它的功能与IPHR相同,除非你明确地创建自己的Lifetimecopes。 – 2012-07-13 12:59:27