2010-12-03 77 views
6

這裏我現在有Unity應用程序塊,如何將參數傳遞給Injection Factory?

Container.RegisterType<IUserManager, UserManagerMock>(); 
    Container.RegisterType<IUser, UserMock>(
       new InjectionFactory(
        (c) => c.Resolve<IUserManager>().GetUser("John"))); 

,並得到它

Container.Resolve<IProfile>(); 

我想通過一個名稱作爲參數傳遞給工廠,這樣我就能夠解決用戶對象與名稱; 類似這樣的:

Container.Resolve<IProfile>("Jonh"); 

如何更改這種情況下的類型註冊?

+0

就我個人而言,我不會嘗試通過服務位置檢索IUser/IProfile。只需通過服務位置檢索IUserManager,然後在代碼中調用GetUser(「John」)即可。 – 2010-12-03 13:19:28

+0

我同意約翰。如果可能,請嘗試使用依賴注入,而不是服務位置。這樣可以讓您的代碼免受調用容器的影響,並且在您的應用程序中調用該容器的單個(或至多幾個)地方。 – Steven 2010-12-04 15:25:51

回答

7

雖然大多數DI框架擁有先進的功能,做這些類型的註冊,我個人而改變設計我應用程序來解決這樣的問題。這使我的DI配置變得簡單,並使代碼更易於理解。尤其對於創建依賴於某些上下文(線程,請求,無論)還是必須明確管理的生命週期的對象,我喜歡定義工廠。工廠使這些事情更加明確。

在你的情況下,你想獲取某個用戶的配置文件。這通常是您希望擁有工廠的東西。這裏有一個例子:

// Definition 
public interface IProfileFactory 
{ 
    IProfile CreateProfileForUser(string username); 
} 

// Usage 
var profile = Container.Resolve<IProfileFactory>() 
    .CreateProfileForUser("John"); 

// Registration 
Container.RegisterType<IProfileFactory, ProfileFactory>(); 

// Mock implementation 
public class ProfileFactory : IProfileFactory 
{ 
    public IProfile CreateProfileForUser(string username) 
    { 
     IUser user = Container.Resolve<IUserManager>() 
      .GetUser(username); 

     return new UserProfile(user); 
    } 
} 

我希望這有助於。

6

解析方法允許傳遞ResolverOverride的參數。 ResolverOverride的子類型是ParameterOverride,可用於將參數傳遞給已解析的構造函數。

你可以這樣來做(參數名稱和傳遞價值是約翰):

Container.Resolve<IProfile>(new ParameterOverride("Name", "John")); 
+0

確實如此,但你不會將這些參數傳遞給工廠方法 – haim770 2015-12-24 14:30:21

相關問題