C# 使用/到ninject绑定中介(shortbus)

C# 使用/到ninject绑定中介(shortbus),c#,.net,asp.net-mvc-5,ninject,ninject.web.mvc,C#,.net,Asp.net Mvc 5,Ninject,Ninject.web.mvc,我正在尝试使用shortbus()的中介模式。除了绑定到ninject之外,一切都很顺利。有这样一个structuremap示例 public BasicExample() { ObjectFactory.Initialize(i => { i.Scan(s => { s.AssemblyContainingType<IMediator>();

我正在尝试使用shortbus()的中介模式。除了绑定到ninject之外,一切都很顺利。有这样一个structuremap示例

    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));
    }
公共基础示例()
{
ObjectFactory.Initialize(i=>
{
i、 扫描(s=>
{
s、 AssemblyContainingType();
s、 装配件();
s、 使用默认约定();
s、 AddAllTypesOf((typeof(IRequestHandler)));
s、 AddAllTypesOf(typeof(INotificationHandler));
});
i、 For()。使用(()=>DependencyResolver.Current);
});
SetResolver(新结构MapDependencyResolver(ObjectFactory.Container));
}
以上内容用于单元测试。我也希望能够进行单元测试,但最重要的是,我只希望它能与整个项目一起工作

有一个NinjectDependencyResolver,它应该可以与ninject一起使用。我只知道要把事情弄清楚是很困难的

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

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

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));
var-kernel=new-StandardKernel();
Bind(x=>x.FromThisAssembly()
.SelectAllClasses()
.继承自任何(
新[]
{
类型(ICommandHandler),
类型(IQueryHandler)
})
.BindDefaultInterfaces());
kernel.Bind().ToMethod(x=>dependencysolver.Current);
SetResolver(新的NinjectDependencyResolver(内核));
您可能需要调整以下内容:

  • FromThisAssembly()
    -->这意味着只有您编写该行的程序集类型才会被绑定。您可以使用另一种机制,指定在哪些程序集中查找
    ICommandHandler
    IQueryHandler
    类型
  • BindDefaultInterfaces()
    :有关说明和备选方案,请参阅
还要注意,我的示例代码基于。最新的ShortBus稳定版本是引用StructureMap


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

完整性。。。别忘了系好你的IMediator

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

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

我不理解您的编辑。我的参考资料中包括Ninject.Web.Common和Ninject.Web.Mvc。我仅通过App_Start/NinjectWebCommon.cs中的公共静态类NinjectWebCommon使用Ninject。我误解了什么吗?只是ShortBus.Ninject基本上只提供了
NinjectDependencyResolver
的另一个实现-我猜是在您没有在web环境中运行的情况下。因此,您实际上并不需要
ShortBus.Ninject
软件包,只需要
ShortBus
(最新测试版)。我还认为,对于ninject.web.mvc,您不需要进行
Bind
ShortBus.dependencysolver.SetResolver
的修改,以防使用ninject的ninject
IContext
(p.Ex.ContextPreservation extension)依赖特性。您有完整的解决方案吗?我一直在努力a)让绑定识别来自任何调用的继承,b)更好地理解这是如何工作的@TwistedInferno你是说运行shortbus&ninject的演示项目?或者到底缺少什么?是的,演示项目将是ace。我添加了shortbus和ninject nuget包,但inheritedfromany行存在问题,添加该行导致编译器不再识别bind方法,我收到一个编译错误“无法将lambda表达式转换为system.type类型,因为它不是委托类型”。我愿意做一些简单的事情。。。