Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用简单的注入器注入控制台应用程序_C#_Dependency Injection_Simple Injector - Fatal编程技术网

C# 使用简单的注入器注入控制台应用程序

C# 使用简单的注入器注入控制台应用程序,c#,dependency-injection,simple-injector,C#,Dependency Injection,Simple Injector,我使用简单的注入器进行测试,但在面向对象编程上非常新。我试图创建松散耦合的类。下面是我的场景 我有这样的用户回购和界面 public class UserRepository : IUserRepository { public void Add(Model.User user) { Console.WriteLine("Name:"+user.Name+"\n"+"SurName:"+user.SurName); } public void D

我使用简单的注入器进行测试,但在面向对象编程上非常新。我试图创建松散耦合的类。下面是我的场景

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

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

引导类在此:

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();
    }
}
类引导
{
公共静态void Start()
{
var container=新容器();
//注册您的类型,例如:
容器。登记(生活方式。单身);
容器。登记(生活方式。单身);
//容器。登记(生活方式。单身);
//container.Register();
container.Register();
//(可选)验证容器。
container.Verify();
}
}
我的问题当我运行程序时,我在
\u userRepository
内部
testinjectclass
上得到一个值异常。
如何将
testinjectclass
UserRepository
正确注入主程序。谢谢

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

_testInjectedClass = Bootstrap.container.GetInstance<ITestInjectedClass>();
并从
Program.Main调用
Bootstrap.Start

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

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

    Console.ReadLine();
}
static void Main(字符串[]args)
{ 
Bootstrap.Start();
_testInjectedClass=Bootstrap.container.GetInstance();
_testInjectedClass.UserRepoRun();
Console.ReadLine();
}

问题是因为您正在调用
程序中的
引导
代码
类实例构造函数

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

尝试更改入口点方法
Main
和“引导”类代码:

static void Main(字符串[]args)
{ 
var container=新容器();
启动(容器);
_testInjectedClass=container.GetInstance();
_testInjectedClass.UserRepoRun();
Console.ReadLine();
}
类引导
{
公共静态无效开始(容器)
{
//注册您的类型,例如:
容器。登记(生活方式。单身);
容器。登记(生活方式。单身);
container.Register();
//(可选)验证容器。
container.Verify();
}
}

请使用SimpleInjector

样品请参考


那么我该如何解决这个问题呢。谢谢在运行程序之前我应该注册所有依赖项吗?我对你的答案做了一个小小的调整。最好直接从容器中解析主类,而不是手动创建主类并解析其依赖项。
static void Main(string[] args)
{ 
    Bootstrap.Start();

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

    Console.ReadLine();
}