2014-07-24 71 views
0

試圖在ASP.Net Web API項目中實現依賴注入。Unity依賴注入 - 如何在運行時創建要注入的實例

我希望能夠在我的一些服務中注入Account的實例。

Account實例應該與用戶Guid一起創建,並且直到運行時才能知道。

所以在我的服務,我有:

 public TransactionService(Account acc) 
     { 
      _account = acc; 
     } 

而在我的應用程序啓動時,我可以做到這一點 - 在容器是一個新的UnityContainer

container.RegisterType<Instanet.Engine.Account>(new InjectionConstructor(new Guid("xxxxxx"))); 

這,當然,是不是任何好的,因爲它會使用相同Account爲每個用戶/請求等。

如果我嘗試使用類似的東西:

container.RegisterType<Instanet.Engine.Account>(new InjectionConstructor(GetTheUsersID())); 

...其中GetTheUsersID()需要檢查Cookie或ASP.Net身份請求,當然在應用程序啓動時不可用。 (請簡單地說,這個DI東西傷害了我的大腦)我是否實現了這個功能,這樣我就可以將實例化的Account注入任何可能需要它的服務中。

回答

0

如果只有一個Account實例可能用於會話,那麼我會在所有服務運行之前在引導代碼中創建一個Account實例。

然後,您可以在您的帳戶實例中填充guid和所有其他數據,並通過container.RegisterInstance方法在Unity中註冊Account類的初始化實例。

後來它會解決你所需要的。

它有幫助嗎?

+1

謝謝,但並不能真正幫助很大。據我所知,引導程序代碼是在應用程序第一次啓動時運行的。因此,這個問題 - 我需要的一些信息目前不可用。賬戶也是遺留的東西,這使得它更加困難。 – Darren

1

您通常不希望爲通過容器解決的組件混合使用狀態和行爲 - DI應該用於可以建模爲純服務的組件。

也就是說,有時在服務組件中包含全局或特定於上下文的狀態是有意義的。

在你的情況下,如果你只需要一個或多個服務本地的UserId(換句話說,不是從一個服務傳遞給另一個服務)。你提到能夠得到一個cookie的用戶ID,所以也許它會看起來像:

public class CookieService : ICookieService 
{ 
    public int GetCurrentUserId() 
    { 
    //pseudo code 
    return HttpContext.Current.GetCookie["UserId"]; 
    } 
} 

現在,你可以注入ICookieService其中需要用戶ID。

更復雜的情況下,可能需要一個抽象工廠:

http://blog.ploeh.dk/2012/03/15/ImplementinganAbstractFactory/

+0

我完全同意,關於混合行爲一點。但我遇到的問題是,服務交互的許多遺留方法需要一個帳戶實例 - 所以直到我們的新API建成時,我必須使用遺留的東西。 DI似乎是讓賬戶準備好的更好方式,而不是在服務中新增賬戶。我確實喜歡你的想法,明天我會給它一個旋風:D謝謝你的好消息。 – Darren