Ninject를 시험해보고 있으며 구조도를 사용하여 코드 작성을 쉽게 수정했습니다. 이 기본 코드에서 구조 맵 레지스트리를 통해 다른 구성을 가진 객체 그래프를 사용하고 런타임에 데이터베이스의 값을 통해 사용되는 객체를 선택합니다 (이 경우 일부 객체가 삽입 된 wcf 서비스 본문을 다시 가져 오기 위해 사용됨) . 예를 들어 (구조 맵 코드 사용) :IoC를 사용하여 인스턴스를 구별하기 위해 이름 사용
레지스트리 1은 IBusinessContext, IRules 및 ILogger 유형의 모든 기본값을 설정합니다. 이것은 GenericContext/Logger/Rules 유형을 다른 전문화가없는 인터페이스와 함께 추가하는 것입니다.
public GenericRegistry()
{
// Set up some generic bindings here
For<ILogger>().Use<Loggers.GenericLogger>();
For<IBusinessRule>().Use<Rules.StandardRule>();
For<IBusinessContext>().Use<Contexts.GenericBusinessContext>();
For<ILoggerContext>().Use<Loggers.GenericLoggerContext>();
}
레지스트리 2 세트까지 IBusinessContext는 SpecialisedContext 클래스를 사용하고 SpecializedLogger를 사용하는 ctor에 지시합니다. IBusinessContext의 인스턴스 이름은 "SpecializedContext"입니다.
이 모든 것이 구조 맵에서 예상대로 작동합니다 (이전 구문 또는 새 구문에 따라 다름).
그러나 Ninject를 사용했을 때 이름없는 인스턴스가 기본이 될 것으로 예상하여 문제가 발생했습니다 (Ninject의 작동 방식이 아니라는 사실을 알고 있습니다). 이로써 명명 된 인스턴스를 사용하는 것이 정말 나쁜 아이디어라는 일부 연구가 이루어졌습니다. 자동 등록 또는 속성을 사용하여 이름을 설정하거나 특정 유형을 요청하는 더 나은 방법이 있지만 시스템에서 런타임에 필요한 구성을 파악할 수있는 방법이 필요하다고 설명합니다. (그리고 IoC 프레임 워크가 등록 된 유형 또는 규칙을 기반으로 나머지를 파악하도록하십시오).
그래서 ... 여기에 IoC 개념을 잘못 사용하고 있습니다. 이름으로 내 최상위 개체를 물어볼 생각입니까? 아니면 일반적으로 내가하려는 일을하는 더 좋은 방법입니까? 대신 MEF와 같은 것을 사용하고이 플러그인을 모두 플러그인으로 취급해야합니까?
스트레스 팩토리처럼 이것을 사용하지 않고 컨테이너의 x 유형 인스턴스에 대한 코드의 각 레벨을 묻는 것은 시작 액션 일뿐입니다.
시간에 미리 감사드립니다 그리고 그것이 당신이 IMO 필요 무엇 달성 할 수있는 유일한 방법 인 경우, 이름 Ninject에 바인딩을 설정하는 모든 것을 아무 문제가 없습니다 :
감사합니다. Aaron! 그것은 나를 위해 몇 가지를 정리했습니다 :) 그것은 매우 감사합니다. – NoodleAwa