我正在学习如何将 nInject 用于我正在开发的新应用程序,并且我创建了以下示例代码,可以将其复制/粘贴到一个简单的控制台应用程序中。它成功返回了一个 IFoo 实例,但我对此有疑问。
我将如何修改代码以使 FooManager 类创建 Foo 对象的实例而不执行“新建”。是否也必须注入(inject)内核?但是如果内核被注入(inject)并且我将行更改为 var foo = _kernel.Get<IFoo>()
,那不是引入服务定位器反模式吗?
namespace IOCTest
{
class Program
{
static void Main(string[] args)
{
using (IKernel kernel = new StandardKernel(new StandardModule()))
{
// do something with the kernal
var mgr = kernel.Get<IFooManager>();
var foo = mgr.GetById(1);
}
}
}
public class StandardModule : Ninject.Modules.NinjectModule
{
public override void Load()
{
Bind<IDatabase>()
.To<Database>()
.InTransientScope();
Bind<IFooManager>()
.To<FooManager>()
.InTransientScope();
}
}
//******************************************************
public interface IDatabase
{
object[] GetScalar(int id);
}
public class Database : IDatabase
{
public object[] GetScalar(int id)
{
return new object[] { "RowName" };
}
}
//******************************************************
public interface IFooManager
{
IFoo GetById(int id);
}
public class FooManager : IFooManager
{
private IDatabase _db;
public FooManager(IDatabase db) { _db = db; }
public IFoo GetById(int id)
{
var results = _db.GetScalar(id);
var foo = new Foo(); // <-- HOW DO I ELIMINATE THIS DEPENDENCY?
foo.Name = results[0].ToString();
return foo;
}
}
//******************************************************
public interface IFoo
{
string Name { get; set; }
}
public class Foo : IFoo
{
public string Name { get; set; }
}
//******************************************************
}
最佳答案
首先,您必须考虑 Foo 的用途。这是某种数据容器还是某种服务?
在第一种情况下,您的代码是完美的。数据容器没有依赖关系,不应由 IoC 容器创建。
在第二种情况下阅读 Ninject.Extensions.Factory。
http://www.planetgeek.ch/2011/12/31/ninject-extensions-factory-introduction/
关于dependency-injection - 如何使用 Ninject 在子类中创建实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10091709/