문제

쓸모없는 프로그램을 수행하십시오.

class Program
{
    static void Main(string[] args)
    {
        IUnityContainer unityContainer = new UnityContainer();
        IWindsorContainer windsorContainer = new WindsorContainer();

        Program unityProgram = unityContainer.Resolve<Program>();
        Program castleProgram = windsorContainer.Resolve<Program>();
    }
}

UnityContainer는 나에게 윈저 컨테이너가 componentNotFoundException을 던지는 프로그램 인스턴스를 반환합니다.

나는 두 가지 행동에 대한 논쟁을 볼 수 있고 내가 끝나는 것은 신경 쓰지 않지만, Prism V2 Drop 8 (최신 작문 시점)은 내부적으로 Unity 행동에 의존하여 등록되지 않은 수업을 요청합니다.

프리즘에 대한이 모든 클래스를 찾아서 등록하기보다는 윈저가 연합처럼 행동하게 만들었습니다. Google 에서이 작업을 도울 수있는 아무것도 찾지 못했고 (내 용어가 잘못되었을지라도) Windsor 문서는 매우 나쁩니다 ...

누구 든지이 문제에 대한 해결책을 제안 할 수 있습니까?

도움이 되었습니까?

해결책

Windsor는 현재이를 지원하지 않으며 디자인에 의한 것입니다. 추론은 잘못 구성된 객체를 얻지 못하도록 필요한 유형을 명시 적으로 등록해야한다는 것입니다.

그러나 WCF 통합 시설에 필요하기 때문에 가까운 시점에 등록되지 않은 유형을 만들기 위해 후크가 추가 될 가능성이 있습니다. (편집 - v2.1에 추가되었습니다 - 살펴보십시오. ILazyComponentLoader에스)

그래도, 게으른 구성 요소 로더에 관계없이, 당신이 할 수있는 최선의 방법은 유창한 API를 사용하여 필요한 기준과 일치하는 어셈블리에서 모든 유형을 등록하는 것입니다. 더 이상 코드가 아니며 밤에는 더 잘 자게 될 것입니다.

스타트 업시 정보가 충분하지 않은 경우에만 게으른 로더를 사용하십시오 ( 구성 뿌리) 필요한 구성 요소를 결정합니다.

다른 팁

Windsor는 상자에서이를 지원하지 않지만이를 수행 할 확장 방법을 만들 수 있습니다.

static class WindsorExtensions
{
    public static object ResolveType(this IWindsorContainer container, Type type)
    {
        if ( type.IsClass && !container.Kernel.HasComponent(type) )
            container.Kernel.AddComponent(type.FullName, type, LifestyleType.Transient);
        return container.Resolve(type);
     }

     public static T ResolveType<T>(this IWindsorContainer container)
     { return (T)ResolveType(container, typeof(T)); }
}

class Program
{
    static void Main(string[] args)
    {
        IUnityContainer unityContainer = new UnityContainer();
        IWindsorContainer windsorContainer = new WindsorContainer();

        Program unityProgram = unityContainer.Resolve<Program>();
        Program castleProgram = windsorContainer.ResolveType<Program>();
    }
}

krzysztof 여기에서 자신의 블로그에 링크하는 것을 두려워하지 마십시오 :) http://devlicious.com/blogs/krzysztof_kozmic/archive/2009/11/16/castle-windsor-lazy-loading.aspx

또한 WPF 앱 에서이 간단한 구현이 유용하다는 것을 알았습니다. 문자열 기부금을 제거하면 일반적인 경우에 가깝습니다.

public class ViewModelLoader : Castle.MicroKernel.Resolvers.ILazyComponentLoader {
    public IRegistration Load(string key, Type service)
    {
        if (service == null)
            return null;
        if (service.Name.EndsWith("ViewModel", StringComparison.CurrentCultureIgnoreCase))
            return Component.For(service).Named(key);
        else
            return null;
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top