Sono un principiante quando si tratta di DI e ninject e sto facendo fatica un po 'su su quando dovrebbe avvenire l'iniezione vera e come iniziare il binding .Ninject - come e quando iniettare
Lo sto usando già nella mia applicazione web e funziona perfettamente lì, ma ora voglio usare l'iniezione in una libreria di classi.
Dire che ho una classe come questa:
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
}
}
voglio utilizzare l'iniezione di proprietà qui perché ho bisogno di passare in un nome di file nel mio costruttore. Ho ragione nel dire che se ho bisogno di passare in un parametro costruttore, non posso usare l'iniezione del costruttore? Se posso utilizzare l'iniezione del costruttore con parametri aggiuntivi, come faccio a passare questi parametri in ?
Ho una console app che consuma per classe di test che sembra come segue:
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();
}
}
mio problema è che quando chiamo test.ImportData()
mio repository sono nulli - nulla è stato iniettato in loro. Ho provato a generare un altro modulo e chiamando
Bind<TestClass>().ToSelf();
come ho pensato che questo potrebbe risolvere tutte le proprietà di iniezione in TestClass
ma sto andando da nessuna parte.
Sono sicuro che questo è un problema banale, ma proprio non riesco a scoprire come fare per questo.
L'utilizzo di kernel.Inject (test) sembra funzionare. Grazie. Per curiosità un'altra domanda - Sto testando nuovamente TestClass perché ho bisogno di passare una stringa nel costruttore. C'è un modo per passare un parametro usando kernel.Get()? –
Sì - ci sono sovraccarichi di Get e puoi anche inserirli nel Legatore –
Generalmente un patttern migliore al posto del cablaggio è che la cosa che ha bisogno del constructor arg invece fa riferimento a un oggetto confuigurator che hai di nuovo up e quindi Bind durante la creazione del modulo –