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