1

如何将IServiceLocator注入到我的类构造函数中?如何通过配置文件做IServiceLocator构造函数注入?

当我想通过我的配置,我上面描述的这样做有一个例外,它不能创造一个RequestHandlersFactory类,因为团结便无法找到构造函数服务定位的AssemblyName

我有两个接口

public interface IPublicService 
{ 
    [OperationContract] 
    [ServiceKnownType("GetKnownTypes", typeof(KnownTypeProvider))] 
    Response Handle(Request request); 
} 

public interface IRequestHandlersFactory 
{ 
    IRequestHandler GetHandler(Type requestType); 
    IRequestHandler GetHandler<T>() 
     where T : Request; 
    IRequestHandler<T, TK> GetHandler<T, TK>() 
     where T : Request 
     where TK : Response; 
} 

和两个类:

public sealed class PublicService: IPublicService 
{ 
    private readonly IRequestHandlersFactory _requestHandlersFactory; 

    public PublicService(IRequestHandlersFactory requestHandlersFactory) 
    { 
     _requestHandlersFactory = requestHandlersFactory; 
    } 

    public Response Handle(Request request) 
    { 
     var handler = _requestHandlersFactory.GetHandler(request.GetType()); 
     return handler.Handle(request); 
    } 
} 


public sealed class RequestHandlersFactory : IRequestHandlersFactory 
{ 
    private readonly IServiceLocator _serviceLocator; 

    private RequestHandlersFactory(IServiceLocator serviceLocator) 
    { 
     _serviceLocator = serviceLocator; 
     ... 
    } 
    public RequestHandlersFactory(IServiceLocator serviceLocator, String assemblyName) : this(serviceLocator) 
    { 
     AddHandlersFromAssembly(Assembly.Load(assemblyName)); 
    } 

    public RequestHandlersFactory(IServiceLocator serviceLocator, Assembly assembly) : this(serviceLocator) 
    { 
     AddHandlersFromAssembly(assembly); 
    } 

    ... 
} 

现在我想建立统一的配置文件:

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity"> 
<alias alias="IPublicService" type="MyAssembly.IPublicService, MyAssembly"/> 
<alias alias="PublicService" type="MyAssembly.PublicService, MyAssembly"/> 
<alias alias="IRequestHandlersFactory" type="MyAssembly.IRequestHandlersFactory, MyAssembly"/> 
<alias alias="RequestHandlersFactory" type="MyAssembly.RequestHandlersFactory, MyAssembly"/> 
<container> 
    <register type="IPublicService" mapTo="PublicService"> 
    <lifetime type="singleton"/> 
    </register> 
    <register type="IRequestHandlersFactory" mapTo="RequestHandlersFactory"> 
    <lifetime type="singleton"/> 
    <constructor> 
     <param name="assemblyName"> 
     <value value="MyAssemblyWithHandlers" /> 
     </param> 
     <param name="serviceLocator" dependencyName="WcfServiceLocator" dependencyType="Microsoft.Practices.ServiceLocation.IServiceLocator, Microsoft.Practices.ServiceLocation"/> 
    </constructor> 
    </register> 
</container> 

我的配置代码:

 var container = new UnityContainer(); 

     //configure container 
     var unitySection = (UnityConfigurationSection)ConfigurationManager.GetSection("unity"); 
     var serviceLocator = new UnityServiceLocator(container); 
     container.RegisterInstance<IServiceLocator>("WcfServiceLocator", serviceLocator, new ContainerControlledLifetimeManager()); 
     unitySection.Configure(container); 

回答

1

尝试交换配置文件中构造函数参数的顺序,使它们与类中的实际参数列表对齐。

相关问题