2016-08-09 122 views
2

我正在嘗試使用動態DI。我有我的配置:動態依賴注入Web Api

container.RegisterType<IUserAdditionalData, UserAdditionalDataRepository>(
    new HierarchicalLifetimeManager()); 
container.RegisterType<IPermission, PermissionRepository>(
    new HierarchicalLifetimeManager());   

config.DependencyResolver = new UnityResolver.UnityResolver(container); 

在這一點上,這一切都OK。但我需要動態設置我的班級。我有兩個類,PermissionRepository和PermissionRepositoryTwo,實現從IPermission,所以我想在PermissionRepository和PermissionRepositoryTwo之間切換。我讀過我可以使用戰略模式,有人有任何想法如何解決這個問題?

+2

你怎麼想這兩種實現之間切換?基於web.config中的配置開關?基於某些運行時數據,如用戶請求? – Steven

+0

感謝您的回覆。我將使用設置請求。我想我可以配置成WebApiConfig文件,但這個文件只被調用一次。 –

回答

3

這是常見的模式是代理模式。這種模式允許您延遲直到運行時使用哪個實現的決定,並在代理內隱藏決策,同時仍然允許完整地構建對象圖。

例子:

public sealed class RequestPermissionSelectorProxy : IPermission 
{ 
    private readonly PermissionRepository one; 
    private readonly PermissionRepositoryTwo two; 

    public RequestPermissionSelectorProxy(
     PermissionRepository one, PermissionRepositoryTwo two) { 
     this.one = one; 
     this.two = two; 
    } 

    // Here select the permission based on some runtime condition. Example: 
    private IPermission Permission => 
     HttpContext.Current.Items["two"] == true ? two : one; 

    public object PermissionMethod(object arguments) { 
     return this.Permission.PermissionMethod(arguments); 
    } 
} 

下面是如何註冊:

container.RegisterType<IPermission, RequestPermissionSelectorProxy>(
    new HierarchicalLifetimeManager()); 
+0

非常感謝!你的答案幫助我! –