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,这取决于给定实体的类型。
- 我应该如何根据 IWorkflowService 和实体的 Employee 类型定义我的统一容器才能获得 EmployeeDataService?
- 我应该如何从 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);
}
}
考虑这些接口,类
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,这取决于给定实体的类型。
- 我应该如何根据 IWorkflowService 和实体的 Employee 类型定义我的统一容器才能获得 EmployeeDataService?
- 我应该如何从 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);
}
}