为我自己的类设置依赖注入

时间:2016-02-04 06:34:06

标签: c# dependency-injection asp.net-mvc-5

我有一点问题,我无法解决与依赖注入相关的问题。我学会了如何使用Ninject为.net mvc 5控制器注入依赖。但是,我无法弄清楚如何为我自己的类注入依赖项。

例如,我有一个资源类。

public class Resource
{
       public IResourceLoader ResourceLoader {get;set}

       public Resource(IResourceLoader ResourceLoader)
       {
              this.ResourceLoader = ResourceLoader; 
       }
}

可以实现IResourceLoader以加载不同类型的资源,例如XMLLoader。因此,当我这样做时,可以使用Ninject自动发送XMLLoader的实例

Resource xmlResource = new Resource(/*do something here/*);

或者更好的是,如果我有一个从Resource继承的Banner类,它将字符串resourceType设置为“xml”并且具有基于该字符串的Ninject过滤器实例。

我是否必须实施工厂模式并自行完成。

由于

2 个答案:

答案 0 :(得分:1)

DI的简单使用是您首先注册依赖项的地方(Ninject称之为'类型绑定'):

Bind<IResourceLoader>().To<XMLLoader>();

然后,您可以通过执行以下操作获取资源实例:

IKernel kernel = new StandardKernel();
var resource = kernel.Get<Resource>();

和Ninject将连接它知道的构造函数类型。

或者,有several other ways to create dependencies,例如包括完全控制用于创建资源实例的参数的能力:

Bind<IResourceLoader>().ToMethod(context => new XMLResourceLoader("schema.xsd"));

上下文绑定

Ninject还支持它调用Contextual Binding的内容,基本上你可以这样做:

Bind<IResourceLoader>().To<SimpleResourceLoader>();
Bind<IResourceLoader>().To<XMLResourceLoader>().Named("XML");

public class Banner : Resource
{
   public Banner([Named("XML")] IResourceLoader resourceLoader) 
     : base(resourceLoader) { }
}

答案 1 :(得分:1)

如果您正在使用Ninject,并且在网络项目中,您应该在NinjectWebCommon.cs文件夹中拥有App_Start课程?

RegisterServices方法中,您可以添加:

kernel
    .Bind<IResourceLoader>()
    .ToMethod<IResourceLoader>(InstantiateResourceLoader)

然后在同一个类中,实现如下方法:

private static IResourceLoader InstantiateResourceLoader(IContext ctx) {
    // Put in whatever logic you need to decide on which loader you want to return
    // Use ctx.Kernel.Get<WhatEver>() if you need something from the DI
    return new XMLLoader();
}