Ninject에서 컨텍스트가 동일 할 때 여러 서비스의 바인딩을 해결하는 더 나은 방법은 무엇입니까?

Jassel

공장 메서드가있는 클래스가 있는데, 직렬화 된 버전을 찾으면 반환해야합니다. 그렇지 않으면 자신의 새 인스턴스를 반환해야합니다.

class ClassToDeserialize : List<SomeClass>
{
    public static event Func<ClassToDeserialize> onNoDeserializationFile;

    public ClassToDeserialize(SomeClass firstInList)
    {
        this.Add(firstInList);
    }

    public static ClassToDeserialize DeserializeIfAny(string jsonPath)
    {
        if (File.Exists(jsonPath))
            return JsonConvert.DeserializeObject<ClassToDeserialize>(File.ReadAllText(jsonPath));

        return onNoDeserializationFile();
    }
}

DI를 사용하도록 응용 프로그램을 리팩터링하려고하는데 문제는 ClassToDeserialize에 대해 이중 바인딩을 수행해야한다는 것입니다.

static void Main(string[] args)
    {
        string json = @"C:\obj_serialized.txt";
        IKernel ninjectKernel = new StandardKernel();
        ClassToDeserialize.onNoDeserializationFile += (() => ninjectKernel.Get<ClassToDeserialize>("NoSerialization"));

        ninjectKernel.Bind<ClassToDeserialize>().ToSelf().Named("NoSerialization").WithConstructorArgument("jsonPath", json);
        ninjectKernel.Bind<ClassToDeserialize>().ToConstant<ClassToDeserialize>(ClassToDeserialize.DeserializeIfAny(json));
    }

onNoDeserializationFile 이벤트를 추가하여 모든 인스턴스화를 처리하고 IoC에서 비즈니스 논리를 분리 한 다음 ClassToDeserialize에 종속 된 서비스를 가져오고이 요청을 해결할 수 있도록 방법을 찾아야합니다. 직렬화 파일이 발견되면 해당 바인딩을 호출해야한다고 ninject에게 알려주십시오 (컨텍스트가 동일하더라도).

ninjectKernel.Get<DependantClass>().DoSomething();

이것이 Service-Locator Antipattern과 유사하다는 것을 알고 있지만 컨테이너를 사용하는 유일한 방법은 아니며이 동작은 내 응용 프로그램의 진입 점에만 연결됩니다.

이 문제를 해결하는 적절한 방법은 무엇입니까?

BatteryBackupUnit

그 결정 논리를 IProvider.

또는 When조건에 대한 바인딩 구문이 있습니다. 컨텍스트 바인딩을 참조하십시오 .

사용 방법 :

kernel.Bind<ClassToDeserialize>().ToSelf()
      .WithConstructorArgument(...); // default binding

kernel.Bind<ClassToDeserialize>()
      .ToMethod(ctx => JsonConvert.DeserializeObject<ClassToDeserialize>(...))
      .InSingletonScope()
      .When(ctx => File.Exists(...));

(힌트 : 컴파일하지 않았으므로 메서드 시퀀스가 ​​약간 벗어 났을 수 있습니다.)

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관