문제

AutoFac에서 전달되는 매개 변수 주위를 헤드를 얻을 수 없으므로 다음 코드는 작동하지 않습니다.

class Config {
    public Config(IDictionary<string, string> conf) {}
}

class Consumer {
    public Consumer(Config config) {}
}

void Main()
{
    var builder = new Autofac.Builder.ContainerBuilder();
    builder.Register<Config>();
    builder.Register<Consumer>();
    using(var container = builder.Build()){
        IDictionary<string,string> parameters = new Dictionary<string,string>();
        var consumer = container.Resolve<Consumer>(Autofac.TypedParameter.From(parameters));
    }
}

던지는 사람 :

DependencyResolutionException: The component 'UserQuery+Config' has no resolvable constructors. Unsuitable constructors included:
Void .ctor(System.Collections.Generic.IDictionary`2[System.String,System.String]): parameter 'conf' of type 'System.Collections.Generic.IDictionary`2[System.String,System.String]' is not resolvable.

그러나 다음 코드 하다 일하다:

IDictionary<string,string> parameters = new Dictionary<string,string>();
var config = container.Resolve<Config>(Autofac.TypedParameter.From(parameters));
var consumer = container.Resolve<Consumer>(Autofac.TypedParameter.From(config));
도움이 되었습니까?

해결책

여기에서 자동 메일 링리스트의 답변을 반복합니다.

매개 변수는 해결중인 서비스의 직접 구현 자와 관련하여 만 해결하기 위해 전달되었으므로 Config의 매개 변수를 소비자에 대한 Resolve Call에 전달하면 작동하지 않습니다. 이 주위의 방법은 소비자 등록을 다음으로 변경하는 것입니다.

builder.Register((c, p) => new Consumer(c.Resolve<Config>(p))); 

다른 팁

AutoFac은 사전 자체가 해결할 수있는 유형이라는 가정에서 구성 클래스의 매개 변수를 해결하려고합니다. 나는 그것을하는 방법에 대한 자동 구문을 모른다. 그러나 구성 유형을 등록 할 때 더 많은 단계를 수행해야 할 것입니다. 예를 들어 새 사전으로 전달되는 대의원을 제공합니다.

불행히도 AutoFac과 같은 IOC 컨테이너에는 "내 마음을 읽으십시오"가 장착되어 있지 않습니다.

당신이하려는 것은 기본적으로 "여기에 관련된 유형 중 하나가 사전이 필요하다는 것을 알고 있으며, 소비자 유형의 서비스가 필요하다는 것입니다. 그 일을한다 옳은 일?".

하나의 서비스를 해결하고 매개 변수를 지정하면 해당 매개 변수가 해당 특정 서비스에 사용되도록 시도됩니다. 컨테이너는 해당 매개 변수 값을 종속성으로 전파하려고 시도하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top