Ich lerne, nInject für eine neue Anwendung, die ich entwickle, zu verwenden, und ich habe den folgenden Beispielcode erstellt, der in eine einfache Konsolenanwendung kopiert/eingefügt werden kann. Es gibt erfolgreich eine Instanz von IFoo zurück, aber ich habe eine Frage dazu.Wie Ninject verwenden, um Instanzen in untergeordneten Klassen zu erstellen?
Wie würde ich den Code ändern, damit die FooManager-Klasse eine Instanz des Foo-Objekts erstellt, ohne ein 'new' auszuführen. Muss der Kern auch gespritzt werden? Aber wenn der Kern injiziert wird und ich die Zeile ändern, um var foo = _kernel.Get<IFoo>()
zu lesen, führt das nicht zu einem Service-Locator-Anti-Pattern?
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; }
}
//******************************************************
}
Danke. Ich hatte auch mit der Fabrik gespielt, aber am Ende schien es nur ein Wrapper um den Kern herum zu sein und musste immer noch überall hin geführt werden. Da ich Foo als Datencontainer benutze, bringt mich dein Kommentar zum Trost, dass es ok ist, in diesem Fall 'neu' zu verwenden! :) –