我正在學習如何使用nInject來開發我正在開發的新應用程序,並且我已經創建了以下示例代碼,可以將其複製/粘貼到簡單的控制檯應用程序中。它成功返回IFoo的一個實例,但我有一個問題。如何使用Ninject在子類中創建實例?
我該如何修改代碼以使FooManager類創建Foo對象的實例而不執行「新建」。內核是否也要注入?但是如果注入了內核並且我將行更改爲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作爲Datacontainer,因此您的評論讓我感到安慰,在這種情況下使用'新'是可以的! :) – 2012-04-11 13:31:23