Soy un novato cuando se trata de DI y ninject y estoy luchando un poco acerca de cuándo debería ocurrir la inyección real y cómo iniciar el enlace .Ninject - cómo y cuándo inyectar
Lo estoy usando ya en mi aplicación web y funciona bien allí, pero ahora quiero usar la inyección en una biblioteca de clases.
Decir que tengo una clase como esta:
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
}
}
Quiero usar la inyección propiedad aquí porque tengo que pasar en un nombre de archivo en mi constructor. ¿Estoy en lo correcto al decir que si necesito pasar un parámetro de constructor, no puedo usar la inyección de constructor? Si puedo usar la inyección del constructor con parámetros adicionales, ¿cómo paso esos parámetros?
Tengo una aplicación de consola que consume por clase de prueba que se ve tan sigue:
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();
}
}
Mi problema es que cuando llamo test.ImportData()
mis repositorios son nulos - nada se ha inyectado en ellos. He intentado crear otro módulo y llamar
Bind<TestClass>().ToSelf();
como pensé que esto podría resolver todas las propiedades de inyección en TestClass
pero estoy llegando a ninguna parte.
Estoy seguro de que este es un problema trivial, pero parece que no puedo averiguar cómo hacerlo.
Usando kernel.Inject (test) parece funcionar. Gracias. Por curiosidad, otra pregunta - Estoy renovando TestClass porque necesito pasar una cadena al constructor. ¿Hay alguna manera de pasar un parámetro usando kernel. Obtener()? –
Sí - hay sobrecargas de Get y también puede ponerlas en el Bind –
Generalmente una mejor patttern en lugar de cablearla así es tener lo que necesita el arg constructor en lugar de referencia un objeto confuigurator que se acaba y luego se une cuando se crea el módulo –