代码之家  ›  专栏  ›  技术社区  ›  Brian J. Hakim

如何通过配置文件注入IServiceLocator构造函数?

  •  1
  • Brian J. Hakim  · 技术社区  · 14 年前

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

    当我试图通过我的配置(如上所述)执行此操作时,出现了一个异常,它无法创建RequestHandlersFactory类,因为unity找不到 服务定位器 程序集名称 .

    我有两个接口

    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配置文件:

      <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 回复  |  直到 14 年前
        1
  •  1
  •   Chris Tavares    14 年前

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