Ninject와 같은 DI 프레임 워크가 기본을 지나치는 방법을 "얻으려면"좀 더 도움이 필요합니다. ...DI 프레임 워크 : 서비스 로케이터 (특히 Ninject 포함)를 사용하지 않고 주입 된 장치를 체인을 통해 지속적으로 전달하는 것을 피하는 방법
class Program {
public static void Main() {
Samurai warrior1 = new Samurai(new Shuriken());
Samurai warrior2 = new Samurai(new Sword());
warrior1.Attack("the evildoers");
warrior2.Attack("the evildoers");
}
}
어디 '하십시오 참조 클래스는 같이 보일 것이다 (위 즉, [주입한다] 참조)는 DI 프레임 워크없이
class Samurai {
private IWeapon _weapon;
[Inject]
public Samurai(IWeapon weapon) {
_weapon = weapon;
}
public void Attack(string target) {
_weapon.Hit(target);
}
}
:
Ninject에 샘플을 가지고 모든 것을 새롭게하는 것. 예, 당신은 사무라이의 의존성을 없앴습니다. 그러나 이제는 사슬림을 한 단계 더 의존하게되었습니다. 단순한. Ninject에와
, 당신은에 의해 newing까지 모든 것을 없애 그러나
class Program {
public static void Main() {
IKernel kernel = new StandardKernel(new WarriorModule());
Samurai warrior = kernel.Get<Samurai>();
warrior.Attack("the evildoers");
}
}
,이 혼란의 나의 영역은 다음과 같습니다 효율적으로 돌봐 서비스 로케이터의 어떤 종류를하지 않고 해당 커널을 newing와 모듈 (즉, IoC.TypeResolver.Get <>())은 무엇입니까? a) 어디서나 새로운 커널을 만들지 않는 가장 좋은 방법은 무엇입니까? (b) 더 중요한 것은, 자신의 의존성과 의존성을 가진 큰 긴 체인, 당신은 내가 심각한 반 패턴 (친구가 그것을 "핫 감자 의존성 주입"안티라고 확신 뭔가에서 모든 방법을 주입의 극단에 가져 가라. -무늬).
다른 말로하면, DI 프레임 워크 마법의 일부분은 체인의 모든 방법으로 종속성을 계속 삽입 할 필요가 없다고 생각했습니다. 즉, 생성자에서 10 개의 매개 변수를 포함하는 첫 번째 참조 체인을 따라 훨씬 더 멀리까지 할 일) - 마술 또는 내 혼란에 대한 해결책은 어디에서나 종속성이 지속적으로 참조되거나 체인을 참조하거나 서비스 로케이터 참조가 어디에나 퍼지지 못하게하는 것입니다.
DI 프레임 워크를 사용하는 경우, 참조 된 클래스에 일반적으로 생성자 (예 : 새로운 ReferencedClass (myList))에 넣을 IList가 필요한 시나리오를 처리하는 가장 좋은 방법은 무엇입니까? 문자열 데이터베이스 연결 문자열과 같은 단순한 경우를 제외하고는 아무 것도하지 않습니다. 그냥 속성을 만들고 그것/DI 프레임 워크 서비스를 찾는 그것을 새롭게 후 그것을 설정? 나는. 벽에 너무 많은 시간이 최선을 결정하기 위해 노력하고
var referencedClass = IoC.Get<IReferencedClass>();
referencedClass.MyList = myList;
모두 모두, 나는 이것이 내가 아마 내가 그것을 얻을 후 약 당황있을거야 후 생각하지만 지금, 나는 내 머리 명중했습니다 접근.
참조 http://stackoverflow.com/questions/367178/usage-of-ioc-containers-specifically-windsor –
고마워. 이 링크는 아마도 지금까지 본 모든 내용 중 가장 좋은 요약 일 것입니다. 즉, 정적 게이트웨이/서비스 로케이터 및 DI 프레임 워크에 대한 다양한 견해가 있습니다. 나는 DI 프레임 워크가 체인을 따라 종속성을 자동으로 초기화하는 기능을 강조하면서 서비스 위치 지정자 참조를 최소화한다고 생각하고 있습니다. – Ted