새로운 유창한 인터페이스를 사용하여 IOC 컨테이너 구성을 사용하는 규칙/관용/패턴

StackOverflow https://stackoverflow.com/questions/456839

문제

나는 컨테이너를 구성하기위한 새로운 유창한 인터페이스를 포함하는 큰 코드를 Castle Trunk로 옮기는 중에 있습니다. 이 프로젝트에는 관리가 가능하지 않은 거대한 WindsorConfig XML 파일이 있으므로이 새로운 기능을 활용하기 시작할 것이라고 생각했습니다. 다른 컨테이너 (예 : StructureMap 2.0)에는 컨테이너 구성을위한 유창한 인터페이스도 포함되어 있으므로이 질문은 Windsor를 기반으로하지 않습니다.

내 질문은 새로운 유창한 스타일 인터페이스를 사용하여 컨테이너 구성에 컨벤션/관용구/패턴을 사용하는 것이 무엇입니까?

첫 번째 생각은 앱이 컨테이너에 사용하는 모든 관련 유형을로드하는 어딘가에 정적 메소드를 만드는 것이 었습니다. 내 걱정은 결국이 모 놀리 식 기능이 XML 구성 파일 (각도 브래킷 세금)만큼이나 인재 할 수 없을 것입니다.

두 번째 생각은 컨벤션에 의해 각 종속 어셈블리가 기본 구성을 내보내기로 분류하는 것이 었습니다. 나는 이것이 어셈블리에서 내부적으로 사용하는 계층 구조에 유용하다는 것을 알 수 있습니다. 그러나 외부에서 사용되는 유형의 경우 구성이 내부적으로 정의되어야합니까?

내가 그것에 대해 더 많이 생각할수록 더 많은 질문을 제기하는 것처럼 보였다. 그것에 대한 당신의 생각은 무엇입니까?

도움이 되었습니까?

해결책

StructureMap 2.5를 더 자세히 살펴보십시오. IOC 컨테이너를 부트 스트랩하기 위해 작업을 크게 줄이는 몇 가지 기능을 제공합니다. 구성 기술에 대한 컨벤션을 제공합니다 (아래 블로그 항목 참조)

Jeremy Miller (StructureMap의 저자)의 다음 최근 블로그 게시물을 참조하십시오.

StructureMap을 사용하여 나만의 자동 등록 컨벤션을 만듭니다

        // Example from the blog post above
        var container = new Container(registry =>
        {
            registry.Scan(x =>
            {
                x.TheCallingAssembly();
                x.With<DefaultConventionScanner>();
            });
        });

StructureMap 2.5.2가 릴리스되었습니다

다른 팁

나는 우리가 Unity를 사용하는 프로젝트를 가지고 있었고 StructureMap에 대한 비디오를 보았고 처음부터 등록 아이디어를 좋아했습니다.

그래서 다음 인터페이스를 만들었습니다.

/// <summary>
/// An interface which must be implemented to create a configurator class for the UnityContainer.
/// </summary>
public interface IUnityContainerConfigurator
{
    /// <summary>
    /// This method will be called to actually configure the container.
    /// </summary>
    /// <param name="destination">The container to configure.</param>
    void Configure(IUnityContainer destination);
}

어셈블리가 기본 구성 자 클래스를 제공하도록합니다. 우리는 또한 우리가 IoC.Resolve<T>, 그리고 방금 래퍼에 다음 기능을 추가했습니다.

    /// <summary>
    /// Configure the IoC
    /// </summary>
    public static class Configure
    {
        /// <summary>
        /// Configure the IoC using by calling the supplied configurator.
        /// </summary>
        /// <typeparam name="TConfigurator">The configurator to use</typeparam>
        public static void From<TConfigurator>() where TConfigurator : IUnityContainerConfigurator, new()
        {
            From(new TConfigurator());
        }
        /// <summary>
        /// Configure the IoC using by calling the supplied configurator.
        /// </summary>
        /// <param name="configurationInterface">The configurator instance to use</param>
        public static void From(IUnityContainerConfigurator configurationInterface)
        {
            configurationInterface.Configure(instance);
        }
        // other configuration.
    }

따라서 초기화 양식에서 프로그램 또는 웹 사이트를 호출합니다.

IoC.Configure.From<BLL.DefaultMapping>();

BLL에는 다음과 같은 클래스가 있습니다.

public class DefaultMapping:IUnityContainerConfigurator
{
    public void Configure(IUnityContainer destination)
    {
        destionation.RegisterType<IRepository, SQLRepository>();
        // and more..
    }
}

유일한 단점은 층이 선택한 IOC 컨테이너에 결합된다는 것입니다.

업데이트:이 답변 이후 나는 내 블로그에 포함 된 기사를 게시했습니다. 통일 포장지.

까다로운 질문 [그리고 나는 IOC 전문가가 아님]이지만 "모 놀리 식 정적 기능"은 거의 구성 파일만큼 무섭습니다. 사물에 대한 자신의 규칙을 정의하고 사물을 추상화하려고 시도 할 수 있습니다. 나는 Ninject를 사용하지만 Windsor의 경우 Alttyme의 전략에 등록하는 것과 같은 것들을 사용하여 짧은 기능을하는 것이 포함될 것이라고 생각합니다.

kernel.Register(AllTypesOf<ISomethingProvider>.
    FromAssembly(Assembly.Load("SomeAssembly")));

자신의 기본 구성을 내보내는 내부 계층에 대해 모릅니다. 그것은 조금 무섭고 반전 된 것 같습니다.

Nineject 프레임 워크를 검사 할 수 있습니다. 매우 간단하고 유창한 인터페이스 및 번개;) XML 구성이없고 API는 매우 간단합니다. 추천

새끼

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top