2016-08-09 94 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

非常感谢!你的答案帮助我! –