2017-11-02 8 views
2

누군가가 여기에 제공된 할릴 칼칸 (@hikalkan)의 지시에 따라 확장 할 수 2.0 구현 : https://github.com/volosoft/castle-windsor-ms-adapter성 윈저 미스 어댑터 코어

원본 - 표준 Microsoft DI

public void ConfigureServices(IServiceCollection services) 
    { 
     services.AddAutoMapper(); 
     services.AddMvc(); 
     services.AddApiVersioning(); 

     services.AddDbContextPool<CIDMSContext>(options => options.UseSqlServer("")); 
     services.AddScoped<IBuildingRepository, BuildingRepository>(); 
     services.AddScoped<IComponentRepository, ComponentRepository>(); 
    } 

NEW를 사용하여 작동 - 작동하지 않습니다. Castle.Windsor.MsDependencyInjection

public IServiceProvider ConfigureServices(IServiceCollection services) 
    { 
     services.AddAutoMapper(); 
     services.AddMvc(); 
     services.AddApiVersioning(); 

     services.AddDbContextPool<CIDMSContext>(options => options.UseSqlServer("")); 
     //services.AddScoped<IBuildingRepository, BuildingRepository>(); 
     //services.AddScoped<IComponentRepository, ComponentRepository>(); 

     return WindsorRegistrationHelper.CreateServiceProvider(
      new WindsorContainer(), services); 
    } 

를 사용하려고 나는 오류를 얻고있다 :

Unable to resolve service for type '...Repositories.Buildings.IBuildingRepository' while attempting to activate ...Controllers.BuildingController'

내 궁극적 인 목표는 DI에 내가 만들 때마다 하나의 저장소가없는 것입니다. 컨벤션을 통해 캐슬 윈저에 DI를 보내고 싶습니다. .Net Core 2.0에서이 작업을 수행 할 수있는 다른 옵션이있는 경우 해당 옵션도 열려 있습니다.

Visual Studio 15.4.1 .Net Core 2.0 API 프로젝트를 사용하고 있습니다.

+0

BuildingController 생성자 코드를 제공하십시오 – itikhomi

+0

왜이 사람이 투표에 실패했는지 자세히 설명해 주시겠습니까? – Ben

답변

2

이러한 어댑터를 사용하지 말 것을 권장합니다. 새로운 .NET Core DI 추상화를 기반으로 우수한 (완벽하게 호환되는) 어댑터를 생성하는 것이 대부분의 DI 컨테이너에 대한 사소한 작업으로 입증되었습니다. 일부 컨테이너는 단순히 Microsoft가 DI 컨테이너를 만든 방식과 호환되지 않으며 Castle Windsor는 좋은 예입니다.

성 윈저 메인테이너는 어댑터를 구축 for quite some time을 시도하지만, 심지어 이것에 대해 마이크로 소프트 컨설팅 후, 마이크로 소프트 acknowledged (copy) 성 윈저는 MS가 용기의 세계를 보는 방법과 호환되지 않습니다.

캐슬 만이이 카테고리에 속하는 컨테이너가 아닙니다. Simple Injector, Ninject, Unity 및 StructureMap과 같은 내용은 새로운 .NET Core DI 추상화와 호환되지 않는 것으로 입증되었습니다. StructureMap에는 실제로 어댑터가 있지만 그 어댑터는 추상화와 100 % 호환되지 않습니다. ASP.NET 코어 프레임 워크 또는 타사 라이브러리가 호환되지 않는 동작에 의존하기 시작하면 분명히 문제가 발생할 수 있습니다.

그래서 시간이 순간에 성 윈저에 대한 호환 어댑터가없고, 성 윈저 메인테이너는 decided yet 그들이해야하거나 적응할 수 있는지를하지 않았습니다.

그러나 호환 어댑터를 사용하면 전혀 문제가 없습니다입니다. Windsor 포럼 here에 언급 된 fir3pho3nixx와 같이 Windsor (및 기타 컨테이너)는 어댑터를 사용하지 않고도 ASP.NET 코어와 쉽게 통합 될 수 있습니다. 기본적으로 몇 가지 코드 만 실행하면됩니다.

+0

감사! 아주 잘 대답했다. 나는 지금 마이크로 소프트의 DI를 사용할 것이라고 생각한다. 나는 수백 개의 저장소를 가질 예정이며 그 목록을 관리하지 않아도되도록 노력하고 있지만 당분간은 그 저장소를 사용하게 될 것입니다. ' 다시 한번 감사드립니다! – Ben

+1

안녕하세요. @ 벤, 나는 내 자신을 분명히하지 않았다고 생각합니다. 합리적인 규모의 응용 프로그램 (있는 것처럼 보일 수 있음)의 경우 Microsoft DI 컨테이너는 일괄 등록 및 유지 관리 가능한 응용 프로그램을 만드는 데 중요한 다른 기능을 지원하지 않기 때문에 매우 쓸모가 없습니다. 사용할 수있는 어댑터가 없더라도 Castle (또는 다른 타사 OSS DI 컨테이너)을 계속 사용하는 것이 좋습니다. 필자가 설명했듯이 ** DI 컨테이너를 ASP.NET 핵심 파이프 라인에 플러그인하기 위해 ** 어댑터가 필요 없습니다. – Steven