【问题标题】:How to do IServiceLocator constructor injection via config file?如何通过配置文件进行 IServiceLocator 构造函数注入?
【发布时间】:2011-05-13 10:47:09
【问题描述】:

如何将 IServiceLocator 注入到我的类构造函数中?

当我尝试通过我的配置执行此操作时,如上所述,我得到一个无法创建 RequestHandlersFactory 类的异常,因为统一无法找到具有 serviceLocatorassemblyName 的构造函数

我有两个接口

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);

【问题讨论】:

    标签: dependency-injection enterprise-library unity-container service-locator


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多