Ich bin ein Neuling, wenn es um DI und Ninject geht und ich habe ein wenig zu kämpfen über, wann die eigentliche Injektion passieren sollte und wie die Bindung zu starten.Ninject - wie und wann zu injizieren
Ich benutze es bereits in meiner Webanwendung und es funktioniert gut dort, aber jetzt möchte ich Injektion in einer Klassenbibliothek verwenden.
sagen, dass ich eine Klasse wie dieses:
public class TestClass
{
[Inject]
public IRoleRepository RoleRepository { get; set; }
[Inject]
public ISiteRepository SiteRepository { get; set; }
[Inject]
public IUserRepository UserRepository { get; set; }
private readonly string _fileName;
public TestClass(string fileName)
{
_fileName = fileName;
}
public void ImportData()
{
var user = UserRepository.GetByUserName("myname");
var role = RoleRepository.GetByRoleName("myname");
var site = SiteRepository.GetByID(15);
// Use file etc
}
}
Ich möchte Injektionseigenschaft verwenden hier, weil ich in einem Dateinamen in meinem Konstruktor übergeben müssen. Bin ich richtig, wenn ich sage, dass, wenn ich in einem Konstruktorparameter übergeben muss, ich Konstruktorinjektion nicht verwenden kann? Wenn ich Injektion Konstruktor mit zusätzlichen Parametern verwenden kann, tun, wie passiere ich die Parameter in?
Ich habe eine Konsolenanwendung, die von Test-Klasse verbraucht, das aussieht wie folgt:
class Program
{
static void Main(string[] args)
{
// NinjectRepositoryModule Binds my IRoleRepository etc to concrete
// types and works fine as I'm using it in my web app without any
// problems
IKernel kernel = new StandardKernel(new NinjectRepositoryModule());
var test = new TestClass("filename");
test.ImportData();
}
}
Mein Problem ist, dass, wenn ich rufe test.ImportData()
meine Repositories sind null - nichts hat sich in sie injiziert. Ich habe versucht, ein weiteres Modul zu schaffen und
Bind<TestClass>().ToSelf();
Aufruf als ich dachte, das könnte alle Injektionseigenschaften in TestClass
lösen, aber ich bin immer nirgendwo.
Ich bin mir sicher, dass dies ein triviales Problem ist, aber ich kann einfach nicht herausfinden, wie das geht.
Verwendung von kernel.Inject (Test) scheint zu arbeiten. Vielen Dank. Aus Neugier eine andere Frage - Ich bin TestClass neu, weil ich eine Zeichenfolge in den Konstruktor übergeben muss. Gibt es eine Möglichkeit, einen Parameter mit Kernel.Get() zu übergeben? –
Ja - es gibt Überladungen von Get und Sie können sie auch in den Bind setzen –
Im Allgemeinen ein besseres Patttern anstelle von hardwiring es so haben Sie die Sache, die den Konstruktor arg stattdessen Verweis ein Confuigurator-Objekt, das Sie neu und dann Bind Beim Erstellen des Moduls –