我有一点问题,我无法解决与依赖注入相关的问题。我学会了如何使用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过滤器实例。
我是否必须实施工厂模式并自行完成。
由于
答案 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();
}