unity tipos net inyeccion framework dependencias asp c# dependency-injection simple-injector

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(); } }