sta*_*ada 8 c# dependency-injection simple-injector
我使用Simple Injector进行测试,但是在OOP上使用了新的.我正在努力创造松散的夫妻班.这是我的情景.
我有这样的用户回购和界面.
public class UserRepository:IUserRepository
{
public void Add(Model.User user)
{
Console.WriteLine("Name:"+user.Name+"\n"+"SurName:"+user.SureName);
}
public void Delete(int id)
{
throw new NotImplementedException();
}
}
public interface IUserRepository
{
void Add(User user);
void Delete(int id);
}
Run Code Online (Sandbox Code Playgroud)
我的TestInjectedClass类和界面就像我计划在Programe 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",SureName = "stack"};
_userRepository.Add(user);
}
}
public interface ITestInjectedClass
{
void UserRepoRun();
}
Run Code Online (Sandbox Code Playgroud)
我的控制台程序如下所示:
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();
}
Run Code Online (Sandbox Code Playgroud)
}
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();
}
}
Run Code Online (Sandbox Code Playgroud)
我运行程序时的问题,我在_userRepository内部得到了值异常TestInjectionClass.如何正确注入TestInjectionClass和UserRepository主程序.谢谢
Dam*_*Arh 11
你需要让Bootstrap.container可用Program.Main,然后用它来创建类的实例,而不是直接直接调用它们的构造函数:
_testInjectedClass = Bootstrap.container.GetInstance<ITestInjectedClass>();
Run Code Online (Sandbox Code Playgroud)
当然,您需要将其公开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();
}
}
Run Code Online (Sandbox Code Playgroud)
并调用Bootstrap.Start来自Program.Main:
static void Main(string[] args)
{
Bootstrap.Start();
_testInjectedClass = Bootstrap.container.GetInstance<ITestInjectedClass>();
_testInjectedClass.UserRepoRun();
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
问题是因为您Bootstrap在Program类实例构造函数中调用代码.
所以,实际上当你启动程序的执行环境时,就是调用入口点方法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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16982 次 |
| 最近记录: |