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

本文关键字:控制台 应用程序 注入 注入器 简单 | 更新日期: 2023-09-27 18:07:12

我使用简单的注入器用于测试目的,但在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类和接口是这样的,我计划在程序主程序中使用。

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

我的问题当我运行程序时,我在TestInjectionClass内部的_userRepository上得到一个值异常。如何将TestInjectionClassUserRepository正确注入主程序?由于

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

您需要使Bootstrap.containerProgram.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();
    }
}

Program.Main调用Bootstrap.Start:

static void Main(string[] args)
{ 
    Bootstrap.Start();
    _testInjectedClass = Bootstrap.container.GetInstance<ITestInjectedClass>();
    _testInjectedClass.UserRepoRun();
    Console.ReadLine();
}

问题是因为您在Program类实例构造函数中调用Bootstrap代码。

所以,实际上当你启动你的程序时,执行环境,正在调用入口点方法Main。你的实例构造函数永远不会被执行。

尝试更改您的入口点方法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();
    }
}

请使用SimpleInjector

样品请参考

http://www.c-sharpcorner.com/UploadFile/4d9083/dependency-injection-using-simple-injector/