【问题标题】:Binding mediator (shortbus) with/to ninject与/到ninject的绑定中介(shortbus)
【发布时间】:2014-10-05 19:20:02
【问题描述】:

我正在尝试将中介模式与 shortbus(https://github.com/mhinze/ShortBus) 一起使用。除了将它绑定到ninject之外,一切都很好。有一个这样的结构图示例

    public BasicExample()
    {
        ObjectFactory.Initialize(i =>
        {
            i.Scan(s =>
            {
                s.AssemblyContainingType<IMediator>();
                s.TheCallingAssembly();
                s.WithDefaultConventions();
                s.AddAllTypesOf((typeof(IRequestHandler<,>)));
                s.AddAllTypesOf(typeof(INotificationHandler<>));
            });

            i.For<IDependencyResolver>().Use(() => DependencyResolver.Current);
        });

        ShortBus.DependencyResolver.SetResolver(new StructureMapDependencyResolver(ObjectFactory.Container));
    }

以上内容用于单元测试。我也希望能够进行单元测试,但最重要的是我只想让它与整个项目一起工作。

有一个 NinjectDependencyResolver,它应该与 ninject 一起使用。我只是知道很难搞清楚。

我将 Ninject MVC 与 NinjectWebCommon 一起使用。 上面的代码应该适用于结构映射,所以我只需要 Ninject 的等效代码。

【问题讨论】:

    标签: c# .net asp.net-mvc-5 ninject ninject.web.mvc


    【解决方案1】:

    Ninject 的工作方式有点不同。 对于 IRequestHandler&lt;,&gt;INotificationHandler&lt;&gt; 类型绑定,您应该使用 ninject.extensions.conventions 并执行以下操作:

    var kernel = new StandardKernel();
    
    kernel.Bind(x => x.FromThisAssembly()
        .SelectAllClasses()
        .InheritedFromAny(
            new[]
            {
                typeof(ICommandHandler<>), 
                typeof(IQueryHandler<,>)
            })
        .BindDefaultInterfaces());
    
    kernel.Bind<IDependencyResolver>().ToMethod(x => DependencyResolver.Current);
    
    
    ShortBus.DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
    

    您可能需要调整以下内容:

    • FromThisAssembly() --> 这意味着只有您编写该行的程序集类型才会被绑定。您可以使用另一种机制,指定在哪些程序集中查找 ICommandHandler&lt;&gt;IQueryHandler&lt;,&gt; 类型。
    • BindDefaultInterfaces():请参阅 here 了解解释和替代方案。

    另请注意,我的示例代码基于ShortBus.Ninject 3.0.48-Beta。最新的 ShortBus stable 版本正在引用 StructureMap。

    编辑:我看到你标记了你的问题asp.net。与其使用StructureMap.NinjectNinjectDependencyResolver,不如使用Ninject.Web.Common(确保它是最新版本!)和Ninject.web.mvc 中的NinjectDependencyResolver

    【讨论】:

    • 我不太懂你编辑。我的参考文献中包含了 Ninject.Web.Common 和 Ninject.Web.Mvc。我只通过 App_Start/NinjectWebCommon.cs 中的公共静态类 NinjectWebCommon 使用 Ninject。我是不是误会了什么?
    • 这只是 ShortBus.Ninject 基本上只提供了NinjectDependencyResolver 的另一种实现——我猜是你不在网络环境中运行的情况。所以你实际上并不需要ShortBus.Ninject 包,而只需要ShortBus(最新的测试版)。我也想用 ninject.web.mvc 你不需要做 Bind&lt;IDependencyResolver&gt;ShortBus.DependencyResolver.SetResolver 需要调整以防有人使用 ninject IContext (p.Ex. ContextPreservation 扩展)依赖功能忍者。
    • 您有完整的解决方案吗?我一直在努力 a) 让绑定识别从任何调用中继承的调用,以及 b) 更好地理解它应该如何工作!
    • @TwistedInferno 你的意思是一个运行短总线和ninject的演示项目?还是缺少什​​么?
    • 是的,一个演示项目将是王牌。我添加了 shortbus 和 ninject nuget 包,但是从任何行继承的行都存在问题,添加该行导致编译器不再识别绑定方法,并且我收到编译错误“无法将 lambda 表达式转换为类型 system.type 因为它是不是委托类型”。我愿意接受它是一件简单的事情......
    【解决方案2】:

    为了完整性...不要忘记绑定您的 IMediator

    kernel.Bind<IMediator>().To<Mediator>();
    

    另外值得注意的是,如果你使用 BindDefaultInterfaces(),你不能随意命名你的处理程序。请参阅 BatteryBackupUnit 发布的链接。

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多