App*_*ere 4 asp.net-mvc dependency-injection ninject inversion-of-control domain-events
我在一个MVC项目中使用Ninject,并且正在尝试按照Udi Dahan的模式实现域事件http://www.udidahan.com/2009/06/14/domain-events-salvation/
在下面的摘录中,"Container"用于解析已引发的特定事件类型的所有事件处理程序.
我的问题(如果我遗漏了一些基本的东西,道歉)是如何使用Ninject做到这一点的?换一种说法:
如何在这个静态类中设置"容器"?
一旦我有一个容器(内核?),Ninject语法将解析所有事件处理程序(我假设我必须先在服务模块中注册)?
我一直在阅读帖子,只应该使用构造函数注入,并且从那里递归地解决所有内容,并且访问Ninject内核是禁止的.因此,非常感谢任何有关如何做到这一点的建议.
摘自文章
public static class DomainEvents
{
[ThreadStatic] //so that each thread has its own callbacks
private static List<Delegate> actions;
public static IContainer Container { get; set; } //as before
//Registers a callback for the given domain event
public static void Register<T>(Action<T> callback) where T : IDomainEvent
{
if (actions == null)
actions = new List<Delegate>();
actions.Add(callback);
}
//Clears callbacks passed to Register on the current thread
public static void ClearCallbacks ()
{
actions = null;
}
//Raises the given domain event
public static void Raise<T>(T args) where T : IDomainEvent
{
if (Container != null)
foreach(var handler in Container.ResolveAll<Handles<T>>())
handler.Handle(args);
if (actions != null)
foreach (var action in actions)
if (action is Action<T>)
((Action<T>)action)(args);
}
}
Run Code Online (Sandbox Code Playgroud)
如何在这个静态类中设置"容器"?
您必须在应用程序启动期间设置它:
DomainEvents.Container = kernel;
Run Code Online (Sandbox Code Playgroud)
解决所有事件处理程序的Ninject语法是什么:
你可以像这样做,例如:
Container.Get<IEnumerable<Handles<T>>>())
Run Code Online (Sandbox Code Playgroud)
Udi的静态DomainEvents
类是Ambient Context反模式的实现(参见DI PP&P第5.3章).在这种情况下,我宁愿使用依赖注入将IDomainEvents
抽象注入到需要它的代码中,而不是让代码依赖于静态实例.
但问题是你的域对象需要依赖于IDomainEvents
构造函数注入(可能)是不可能的.诀窍是在这种情况下使用方法注入.
换句话说,使用构造函数注入来注入IDomainEvents
命令处理程序或服务(或者你在业务逻辑中使用域对象上的方法),并在调用需要它的方法时将该依赖项传递给域对象(方法)注射).
归档时间: |
|
查看次数: |
1831 次 |
最近记录: |