새로운 유창한 인터페이스를 사용하여 IOC 컨테이너 구성을 사용하는 규칙/관용/패턴
-
19-08-2019 - |
문제
나는 컨테이너를 구성하기위한 새로운 유창한 인터페이스를 포함하는 큰 코드를 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>();
});
});
다른 팁
나는 우리가 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는 매우 간단합니다. 추천