1

Wie injiziere IServiceLocator zu meinem Klassenkonstruktor? Wie IServiceLocator-Konstruktor-Injektion über Konfigurationsdatei zu tun?

Als ich versuchte, das über meine Config zu tun, über die ich beschrieben habe eine Ausnahme, dass es konnte keine RequestHandlersFactory Klasse zu erstellen, da die Einheit den Konstruktor mit Servicelocator und assembly finden could't.

Ich habe zwei Schnittstellen

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

und zwei Klassen:

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

    ... 
} 

Nun ich Einheit Konfigurationsdatei erstellt werden soll:

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

Meine Config-Code:

Antwort

1

Versuchen Sie, die Reihenfolge der Konstruktorparameter in der Konfigurationsdatei so zu ändern, dass sie mit der tatsächlichen Parameterliste in der Klasse übereinstimmen.