Unity:配置容器以多种方式解析为同一类型

Unity: configure container to resolve to same type in mutliple ways

考虑这些接口,类

interface IWorkflowService
{
    void FillContext(WFContext context, IWorkflowableEntity entity);
}

interface IDataService<Entity> 
{
}

abstract class DataService<TEntity>
{      
}

class EmployeeDataService : IWorkflowService, DataService<Employee>
{
}

class WorkflowHandler
{
    private IUnityContainer _container;

    public bool Handle(IWorklfowableEntity entity)
    {
        // now I want to resolve the correct IWorkflowService
        // suppose entity is an employee Entity
        // EmployeeDataService should be resolved
    }
}

//container definition:
container.RegisterType<IDataService<employee>, EmployeeDataService>();

在 Workflhandler 中,我想解析正确的 IWorkflowService,这取决于给定实体的类型。

  1. 我应该如何根据 IWorkflowService 和实体的 Employee 类型定义我的统一容器才能获得 EmployeeDataService?
  2. 我应该如何从 Workflowhandler 中的 Handle 方法中调用它?

顺便说一句:也许我误用了 Unity 作为服务定位器。如果是这种情况,我是否应该创建自己的服务定位器以获得正确的服务?

提前感谢您的任何想法和回答。

正如我所怀疑的那样,将统一容器用作服务定位器被认为是一种不当行为。

相反,工作流处理程序 class 应该依赖于工厂。这在编写横切功能和使用依赖注入时经常需要。

所以 WorkflowHandler 看起来像这样:

class WorkflowHandler 
{
    private IWorkflowServiceFactory _wfsfactory

    public WorkflowHandler(IWorkflowServiceFactory workflowservicefactory)
    {
        _wfsfactory = workflowservicefactory;
    }

    public bool Handle(IWorklfowableEntity entity)
    {
        var svc = _wfsfactory.GetServiceByEntity(entity);
        var context = new WfContext();
        svc.FillContext(context, entity);

        //handle evaluate etc.
    }
}

服务工厂看起来像这样:

class WorkflowServiceFactory : IWorkflowServiceFactory
{
    private IUnityContainer _container;

    public GetServiceByEntity(IWorkflowableEntity entity)
    {
        Type t = typeof(IDataService<>);
        Type fulltype = t.MakeGenericType(new [] { entity.GetType() });

        return _container.Resolve(fulltype);
    }

}