加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 将Ninject与Udi Dahan的域事件一起使用

发布时间:2020-12-16 06:48:05 所属栏目:asp.Net 来源:网络整理
导读:我在一个MVC项目中使用Ninject,并且正在尝试按照Udi Dahan的模式 http://www.udidahan.com/2009/06/14/domain-events-salvation/实现域事件 在下面的摘录中,“Container”用于解析已引发的特定事件类型的所有事件处理程序. 我的问题(如果我遗漏了一些基本内
我在一个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);
 }
}

解决方法

How does the “Container” get set in this static class?

您必须在应用程序启动期间设置它:

DomainEvents.Container = kernel;

what would be the Ninject syntax to resolve all the event handlers:

你可以像这样做,例如:

Container.Get<IEnumerable<Handles<T>>>())

Udi的静态DomainEvents类是Ambient Context反模式的实现(参见DI PP&P章5.3).在这种情况下,我宁愿使用依赖注入将IDomainEvents抽象注入到需要它的代码中,而不是让代码依赖于静态实例.

但问题是你的域对象需要依赖IDomainEvents,并且(可能)不可能进行构造函数注入.诀窍是在这种情况下使用方法注入.

换句话说,使用构造函数注入将IDomainEvents注入命令处理程序或服务(或者您使用域对象上的方法调用业务逻辑),并在调用需要它的方法时将该依赖项传递给域对象(方法注入).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读