2015-05-14 44 views
1

团结DI注册的实例无法正确注射

我已经设置了容器这样我有团结与实例解析问题:

var token = new SecurityToken(); 
token.Token = "Test"; 
token.Value = "Test"; 

var passport = new PassportContext(); 
passport.Permissions = new SecurityPermissions { Add = true, Change = true, Inquiry = true, Delete = true }; 

_unityContainer = new UnityContainer(); 
_unityContainer.RegisterInstance<PassportContext>(passport, new ContainerControlledLifetimeManager()); 
_unityContainer.RegisterInstance<SecurityToken>(token, new ContainerControlledLifetimeManager()); 
_unityContainer.RegisterType<IWorksheetRepository, WorksheetRepository>(); 

PassportContextSecurityToken所需的Web服务在存储库中调用以获取数据。

我解决我的WorksheetRepository这样的:

UnityContainer.Resolve<IWorksheetRepository>(); 

它实例我WorksheetRepository

public sealed class WorksheetRepository : IWorksheetRepository 
{ 
    private PassportContext _passportContext; 
    private SecurityToken _token; 

    public WorksheetRepository(PassportContext passportContext, SecurityToken token) 
    { 
     _passportContext = passportContext; 
     _token = token; 
    } 
} 

现在,我的问题是,在WorksheetRepository构造,既PassportContextSecurityToken被实例化,但所有属性是它们的默认值,而不是我在我的设置中设置的值。我将它们设置为单身人士,所以当我解决IWorksheetRepository时,我的单身人士是否应该注入我的WorksheetRepository实施中?我在这里失去了与统一的东西吗?

有点背景 - 我试图遵循最佳实践。我知道你的大多数应用程序应该不知道你的Unity容器,它应该解决应用程序根目录下的依赖关系。这是我试图遵循的模式,尽管这是一个单元测试。

+0

我无法重现您描述的问题。鉴于你在这里的确切代码,我能够用正确的护照上下文和安全令牌来解析存储库。在RegisterInstance调用后,您是否有注册类型(可能按惯例?)到容器中,可能会覆盖这些注册?你有多个统一容器吗? – TylerOhlsen

回答

0

看看这个例子,我在这里使用了InjectionProperty来提供实例。

public class SecurityPermissions 
{ 
    public bool Add { get; set; } 
    public bool Change { get; set; } 
} 

public class PassportContext 
{ 
    public SecurityPermissions MyProperty { get; set; } 
} 

[TestMethod] 
public void YourUnitTest() 
{ 

using (var c = new UnityContainer()) 
{ 
    var sp = new SecurityPermissions() { Add = true, Change = true }; 

    c.RegisterType(typeof(PassportContext), new InjectionProperty("MyProperty", sp)); 
    var pc = c.Resolve<PassportContext>();