2017-06-12 107 views
0

考虑接口IWorkflow,它是我们定义的SDK中的合同。租户可以提供自己的定制实现IWorkflow。因此,在运行时,我们需要基于租户上下文动态加载:使用Unity的多租户依赖关系解决方案

var container = new UnityContainer(); 
container.RegisterTenantCustomizations(); 
var workflow0 = container.ResolveForTenant<IWorkflow>("tenant0"); 
var workflow1 = container.ResolveForTenant<IWorkflow>("tenant1"); 
var workflow2 = container.ResolveForTenant<IWorkflow>("tenant2"); 
          ^^^^^^^^^^^^^^^^ 

此扩展方法的外观应该如何? Unity IOC是否提供了一个属性,我们可以使用它来修饰它们各自的租户的类别?

+0

为什么每个租户没有单独的容器,如果租户特定容器中没有条目,则回退到默认容器,看起来简单而整洁? – Saravanan

回答

0

比方说,你定义在组合物根的定义,因为这

container.RegisterType<IWorkflow, TenantClassDefault>(); 
container.RegisterType<IWorkflow, TenantClass0>("tenant0"); 
container.RegisterType<IWorkflow, TenantClass1>("tenant1"); 
container.RegisterType<IWorkflow, TenantClass2>("tenant2"); 

然后你可以扩展IUnityContainer接口,并创建您的解析器这样

public static class IUnityContainerExt 
{ 
    public static IWorkflow ResolveForTenant(this IUnityContainer container, string name) 
    { 
     IWorkflow workflow; 
     try 
     { 
      workflow = container.Resolve<IWorkflow>(name); 
     } 
     catch (ResolutionFailedException e) 
     { 
      //If the resolver can't resolve the name it will throw ResolutionFailedException and you can select the default instead 
      workflow = container.Resolve<IWorkflow>(); 
     } 
     return workflow; 
    } 
} 

然后你就可以直接使用它货柜

var workflow0 = container.ResolveForTenant("tenant1"); 

您可以阅读更多关于它here

+0

有趣的是,无论如何,我们可以实现使用自定义属性?我们需要支持使用的边缘,默认是没有类型是为租户注册的。 – bartonm

+0

@bartonm更新了我的答案。 –