简体   繁体   English

使用 Simple Injector 注入控制台应用程序

[英]Injection into Console Application with the Simple Injector

I am using Simple Injector for test purpose but pretty new on OOP.我正在使用 Simple Injector 进行测试,但在 OOP 上还是很新的。 I am trying to create loosely couple classes.我正在尝试创建松散耦合的类。 Here is the my scenario.这是我的场景。

I have User repo and interface like this.我有这样的用户仓库和界面。

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

My TestInjectedClass Class and interface are something like this which I am planning to use in Program Main.我的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();
}

And My console program looks like this:我的控制台程序如下所示:

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 here:这里的 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();
    }
}

My problem when I run program, I am getting a value exception on the _userRepository inside TestInjectionClass .我在运行程序时遇到的问题是,在_userRepository内的TestInjectionClass上出现值异常。 How can I properly inject TestInjectionClass and UserRepository to Main Program.如何将TestInjectionClassUserRepository正确注入TestInjectionClass Thanks谢谢

You need to make Bootstrap.container available in Program.Main and then use it to create instances of classes instead of directly calling their constructors directly:您需要在Program.Main中使Bootstrap.container可用,然后使用它来创建类的实例,而不是直接调用它们的构造函数:

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

Of course you will need to expose it in Bootstrap for that to work:当然,您需要在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();
    }
}

And call Bootstrap.Start from Program.Main :并从Program.Main调用Bootstrap.Start

static void Main(string[] args)
{ 
    Bootstrap.Start();

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

    Console.ReadLine();
}

The problem is because you are calling your Bootstrap code in Program class instance constructor.问题是因为您在Program类实例构造函数中调用Bootstrap代码。

So, actually when you start your program the execution environment, is calling entry point method Main .因此,实际上当您启动程序时,执行环境正在调用入口点方法Main And your instance constructor is never executed.并且您的实例构造函数永远不会执行。

Try changing your entry point method Main and 'Bootstrap' class code:尝试更改您的入口点方法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();
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM