2015-05-14 42 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>();