공장 메서드가있는 클래스가 있는데, 직렬화 된 버전을 찾으면 반환해야합니다. 그렇지 않으면 자신의 새 인스턴스를 반환해야합니다.
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과 유사하다는 것을 알고 있지만 컨테이너를 사용하는 유일한 방법은 아니며이 동작은 내 응용 프로그램의 진입 점에만 연결됩니다.
이 문제를 해결하는 적절한 방법은 무엇입니까?
그 결정 논리를 IProvider
.
또는 When
조건에 대한 바인딩 구문이 있습니다. 컨텍스트 바인딩을 참조하십시오 .
사용 방법 :
kernel.Bind<ClassToDeserialize>().ToSelf()
.WithConstructorArgument(...); // default binding
kernel.Bind<ClassToDeserialize>()
.ToMethod(ctx => JsonConvert.DeserializeObject<ClassToDeserialize>(...))
.InSingletonScope()
.When(ctx => File.Exists(...));
(힌트 : 컴파일하지 않았으므로 메서드 시퀀스가 약간 벗어 났을 수 있습니다.)
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다