c# - tipos - inyeccion de dependencias youtube
Inyección en la aplicación de consola con el inyector simple (3)
Necesita hacer que Bootstrap.container
esté disponible en Program.Main
y luego usarlo para crear instancias de clases en lugar de llamar directamente a sus constructores directamente:
_testInjectedClass = Bootstrap.container.GetInstance<ITestInjectedClass>();
Por supuesto, tendrá que exponerlo en Bootstrap
para que funcione:
class Bootstrap
{
public static Container container;
public static void Start()
{
container = new Container();
// Register your types, for instance:
container.Register<IUserRepository, UserRepository>(Lifestyle.Singleton);
container.Register<ITestInjectedClass, TestInjectedClass>(Lifestyle.Singleton);
//container.Register<IUserRepository, TestInjectedClass>(Lifestyle.Singleton);
//container.Register<IUserContext, WinFormsUserContext>();
container.Register<TestInjectedClass>();
// Optionally verify the container.
container.Verify();
}
}
Y llame a Bootstrap.Start
Program.Main
desde Program.Main
:
static void Main(string[] args)
{
Bootstrap.Start();
_testInjectedClass = Bootstrap.container.GetInstance<ITestInjectedClass>();
_testInjectedClass.UserRepoRun();
Console.ReadLine();
}
Estoy usando Simple Injector para fines de prueba pero prety nuevo en OOP. Estoy tratando de crear un par de clases sueltas. Aquí está el mi escenario.
Tengo un repositorio de usuario y una interfaz como esta.
public class UserRepository:IUserRepository
{
public void Add(Model.User user)
{
Console.WriteLine("Name:"+user.Name+"/n"+"SurName:"+user.SureName);
}
public void Delete(int id)
{
throw new NotImplementedException();
}
}
public interface IUserRepository
{
void Add(User user);
void Delete(int id);
}
My TestInjectedClass
Class e interfaz algo así que estoy planeando usar en Programe Main.
public class TestInjectedClass:ITestInjectedClass
{
private readonly IUserRepository _userRepository;
public TestInjectedClass(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public void UserRepoRun()
{
var user = new User() {Id = 1,Name = "ada",SureName = "stack"};
_userRepository.Add(user);
}
}
public interface ITestInjectedClass
{
void UserRepoRun();
}
Y mi programa de consola se ve así:
class Program
{
static ITestInjectedClass _testInjectedClass;
private static IUserRepository _userRepository;
static void Main(string[] args)
{
_testInjectedClass= new TestInjectedClass(_userRepository);
_testInjectedClass.UserRepoRun();
Console.ReadLine();
}
public Program()
{
Bootstrap.Start();
}
}
Clase BootStrap aquí:
class Bootstrap
{
public static void Start()
{
var container = new Container();
// Register your types, for instance:
container.Register<IUserRepository, UserRepository>(Lifestyle.Singleton);
container.Register<ITestInjectedClass, TestInjectedClass>(Lifestyle.Singleton);
//container.Register<IUserRepository, TestInjectedClass>(Lifestyle.Singleton);
//container.Register<IUserContext, WinFormsUserContext>();
container.Register<TestInjectedClass>();
// Optionally verify the container.
container.Verify();
}
}
Mi problema cuando ejecuto el programa, _userRepository
excepción de valor en _userRepository
dentro de TestInjectionClass
. ¿Cómo se puede inyectar TestInjectionClass
y UserRepository
a Main UserRepository
? Gracias
El problema se debe a que está llamando a su código Bootstrap
en Program
constructor de instancias de clase de Program
.
Entonces, en realidad, cuando inicia su programa en el entorno de ejecución, está llamando al método de punto de entrada Main
. Y el constructor de su instancia nunca se ejecuta.
Intente cambiar su método de punto de entrada Main
y el código de clase ''Bootstrap'':
static void Main(string[] args)
{
var container = new Container();
Bootstrap.Start(container);
_testInjectedClass = container.GetInstance<TestInjectedClass>();
_testInjectedClass.UserRepoRun();
Console.ReadLine();
}
class Bootstrap
{
public static void Start(Container container)
{
// Register your types, for instance:
container.Register<IUserRepository, UserRepository>(Lifestyle.Singleton);
container.Register<ITestInjectedClass, TestInjectedClass>(Lifestyle.Singleton);
container.Register<TestInjectedClass>();
// Optionally verify the container.
container.Verify();
}
}
Por favor use SimpleInjector
Muestra por favor refiérase
http://www.c-sharpcorner.com/UploadFile/4d9083/dependency-injection-using-simple-injector/