단일 메서드 인터페이스 대신 명명 된 대리자를 사용하여 실험 해 왔습니다.캐슬 윈저에 정적 클로저를 등록하는 간단한 방법이 있습니까?
public interface IProductSource
{
IEnumerable<Product> GetProducts();
}
public class DataContextProductSource : IProductSource
{
private readonly DataContext _DataContext;
public DataContextProductSource(DataContext dataContext)
{
if (dataContext == null) throw new ArgumentNullException("dataContext");
_DataContext = dataContext;
}
public IEnumerable<Product> GetProducts()
{
return _DataContext.Products.AsEnumerable();
}
}
에 :
public delegate IEnumerable<Product> DGetProducts();
public static class DataContextFunctions
{
public DGetProducts GetProducts(DataContext dataContext)
{
if (dataContext == null) throw new ArgumentNullException("dataContext");
return() => dataContext.Products.AsEnumerable();
}
}
이것은 기본적으로 사실을 활용하고 우리가 (사건을 과장하지 않도록 제거 일부 바꿈)에서 갈 수 이것은 코드 크기에 대한 몇 가지 장점이 있습니다 일단 당신이 의존성 주입으로 충분히 멀리 가면, 많은 클래스가 클로저가 될 것입니다. 이러한 클래스는 람다를 반환하는 함수로 대체 될 수 있습니다. 관련된 함수의 전체 집합 (변경 가능한 상태를 캡슐화 할 필요는 없지만 "표준"종속성 주입의 클래스를 사용하여 표현되었을 수 있음)은 정적 클래스 (또는 VB 용어로 "모듈")로 롤업 될 수 있습니다. .
이것은 모두 훌륭하지만 좋지만 Castle Windsor에 이러한 정적 방법을 등록하는 가장 좋은 방법을 찾는 데 어려움을 겪고 있습니다. 종속성이없는 메소드는 간단합니다.
Component.For<DGetIntegers>().Instance(Integers.GetOneToTen)
그러나 위의 DataContextFunctions.GetProducts는 몇 가지 종속성이 있습니다.
Component.For<DGetProducts>().UsingFactoryMethod(
kernel => DataContextFunctions.GetProducts(kernel.Resolve<DataContext>())
이 매우 상세 얻을 수 있고, 분명히 각 종속 직접 커널을 요청해야하는 종류의 포인트를 조금 패배 :이 등록 찾은 가장 좋은 방법입니다. 컨테이너에 필요한 모든 정적 정보를 사용할 수 있으므로이 작업을 수행 할 수 있어야합니다.
캐슬 윈저 (또는 다른 컨테이너)는 내가하지 못했던 간단한 방법, 또는 기술적 인 문제가 발생했는지, 아니면 너무 틈새로 만든 유스 케이스인가? 포함되어 있습니까?
고마워요, 크 르지 스 토프. 나는 언젠가 그것을 밖으로 시도하고 결과를 다시보고합니다. 좋은 장소를 시작할 수있는 링크가 있습니까? – ninjeff
@ninjeff 2.5.x를 사용하는 경우 문서가 시작해야합니다. docs.castleproject.org/(S(hucszcu5ilznbv45fvrim355))/... 3.0 베타 버전의 경우 개념은 그대로 있지만 일부 API가 변경되었습니다. 같은. 도코가 완벽하지 않다는 것을 알려주십시오. –
나는이 일을 할 수있었습니다. 한 시간 안에 내 자신의 대답으로 링크와 설명을 게시 할 것입니다 (나 같은 저 카르마 사용자는 8 시간 이내에 우리 자신의 질문에 대답 할 수 없습니다). – ninjeff