2015-08-09 80 views
4

我正在使用简单注射器进行测试,但在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); 
} 

TestInjectedClass类和接口这样的事情,我很planng在PROGRAME主要使用。

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

和我的控制台程序是这样的:

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

    } 
} 

我的问题,当我运行程序时,我得到的值异常在_userRepository里面TestInjectionClass。 如何正确注入主程序TestInjectionClassUserRepository。由于

+0

这样我怎么能解决这个问题。 thankx – stackada

+0

我应该在运行程序之前注册所有依赖关系 – stackada

回答

7

你需要让Bootstrap.container提供Program.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(); 
    } 
} 

并调用Bootstrap.StartProgram.Main

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

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

    Console.ReadLine(); 
} 
5

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

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

试着改变你的入口点方法Main和 '引导' 类代码:

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

我对y做了一个小调整我们的答案。最好直接从容器中解析主类,而不是手动创建并解决其依赖关系。 – Steven

+2

你是对的,谢谢@斯蒂文 –

相关问题