代码之家  ›  专栏  ›  技术社区  ›  stackada

用简单注射器注入控制台应用程序

  •  8
  • stackada  · 技术社区  · 11 年前

    我使用Simple Injector进行测试,但在OOP上很新。我正在尝试创建松散耦合的类。这是我的设想。

    我有这样的用户回购和界面。

    public class UserRepository : IUserRepository
    {
        public void Add(Model.User user)
        {
            Console.WriteLine("Name:"+user.Name+"\n"+"SurName:"+user.SurName);
        }
    
        public void Delete(int id)
        {
            throw new NotImplementedException();
        }
    }
    
    public interface IUserRepository
    {
        void Add(User user);
        void Delete(int id);
    }
    

    我的 TestInjectedClass 类和接口是我计划在Program 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",SurName = "stack"};
            _userRepository.Add(user);
        }
    }
    public interface ITestInjectedClass
    {
        void UserRepoRun();
    }
    

    我的控制台程序如下所示:

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

    }

    BootStrap类在这里:

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

    我的问题是,当我运行程序时 _userRepository 在…内 TestInjectionClass . 如何正确注射 测试注入类 和 UserRepository 到主程序。谢谢

    3 回复  |  直到 6 年前
        1
  •  11
  •   Damir Arh    11 年前

    你需要 Bootstrap.container 在中可用 Program.Main 然后使用它创建类的实例,而不是直接调用它们的构造函数:

    _testInjectedClass = Bootstrap.container.GetInstance<ITestInjectedClass>();
    

    当然,你需要在 Bootstrap 要使其工作:

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

    然后打电话 Bootstrap.Start 从…起 程序.Main :

    static void Main(string[] args)
    { 
        Bootstrap.Start();
    
        _testInjectedClass = Bootstrap.container.GetInstance<ITestInjectedClass>();
        _testInjectedClass.UserRepoRun();
    
        Console.ReadLine();
    }
    
        2
  •  6
  •   GFoley83 quadroid    10 年前

    问题是因为你打电话给 Bootstrap 代码输入 Program 类实例构造函数。

    因此,实际上,当您启动程序时,执行环境是调用入口点方法 Main 。并且永远不会执行实例构造函数。

    尝试更改入口点方法 主要的 和“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();
        }
    }
    
    推荐文章