0

다음과 같습니다.리포지토리에 서비스를 시작 하시겠습니까?

interface IRepository 
--interface IRepositoryEF: IRepository 
--interface IRepositoryNH: IRepository 
----interface ICategoryRepositoryEF: IRepositoryEF 
----interface ICategoryRepositoryNH: IRepositoryNH 

나는 서비스에 CategoryRepositoryEFCategoryRepositoryNH 클래스를 사용하고 싶습니다. 카테고리 서비스에 어떻게 삽입 할 수 있습니까?

CategoryService(IRepository repository) 
{ 

} 

가장 좋은 방법은 무엇입니까? RepositoryFactory을 사용하여 서비스에 삽입 한 다음 서비스에 리포지토리를 만들 수 있습니까?

다음과 같은 의미입니다.

CategoryService(CategoryRepositoryFactory factory) 
{ 
    var CategoryRepositoryEF = factory.Create("EF"); 
    var CategoryRepositoryNH = factory.Create("NH"); 
} 

이 좋은 생각인가요? 아니면 완전히 틀렸어?

+0

이 왜'CategoryService'이 필요로 하는가를 같은 주체에 대한 두 개의 저장소? – Steven

+0

@Steven, 사실, 나는 동일한 서비스에서 ADO.NET과 Entity 프레임 워크를 사용해야하고, EF로 CRUD 작업을 수행하고 ADO.NET으로 작업을 선택해야합니다. 이것은 비즈니스 규칙입니다 ... [http] http : //www.codeproject.com/Articles/522226/ADO-NET-2cplustheplusrightplusway)을 내 EF 저장소 –

+0

비즈니스 규칙에 추가 하시겠습니까? 나는 당신이 건축 법칙을 의미한다고 생각합니다. 비즈니스는 어떤 기술을 사용하는지 신경 쓰지 않을 것입니다 (물론 MS를 위해 일할 때를 제외하고는 Java를 사용할 수 없습니다) :-D – Steven

답변

2

아이디어가 약간 벗어났습니다.

저장소 인터페이스의 목적은 데이터 원본을 추상화하는 것입니다. 목표는 모든 사용하는 클래스가 데이터의 출처를 모른 채 정보를 가져올 수 있도록하는 것입니다. 하지만 귀하의 경우에는 NHibernate 또는 EntityFramework가 사용되는지를 알도록 강요합니다. 왜?

또한 특정 인터페이스를 만들 때 IRepository 인터페이스가 없습니다.

이제 질문은 오히려 "어떻게 nhibernate 또는 엔티티 프레임 워크 저장소를 내 인터페이스 중 하나에 매핑합니까"입니다.

응용 프로그램이 시작될 때 수행되어야합니다. 당신은 일반적으로 같은 것을 할 :

container.Register<ICategoryRepostitory, NHCategoryRepository>(); 
container.Register<IUserRepostitory, EFUserRepository>(); 

당신이 effectivly 특정 구현과 함께 사용하여 코드를 결합 것을하지 않으면. 실제로 모든 인터페이스가 필요하지 않습니다.

업데이트 내가 CategoryService(ICategoryRepository repository)처럼 주입하는 경우 사용되는 저장소

?

대조 컨테이너 반전에 등록한 저장소. 내 요점은 두 가지 구현을 등록하지 말고 모든 저장소에 대해 하나만 등록해야한다는 것입니다.

간단한 예가 아래에 있습니다.

<configuration> 
    <appSettings> 
    <add key="RepositoryType" value="NHibernate" /> 
    </appSettings> 
</configuration> 

을 그리고 당신은 컨트롤 컨테이너의 당신의 반전 구성 할 때 다음을 수행하십시오 :

먼저 당신의 Web.config와 함께 저장소 유형을 관리

if (ConfigurationManager.AppSettings["RepositoryType"] == "NHibernate")) 
{ 
    _autofac.RegisterType<NHCategoryRepository>.As<ICategoryRepository>(); 
    _autofac.RegisterType<NHUserRepository>.As<IUserRepository>(); 
} 
else 
{ 
    _autofac.RegisterType<EFCategoryRepository>.As<ICategoryRepository>(); 
    _autofac.RegisterType<EFUserRepository>.As<IUserRepository>(); 
} 
+0

이 대답은 절대 "꺼지지"않습니다. 당신은 절대적으로 자리하고 있습니다. 그에게 문제를 일으키는 그의 디자인. 그의 추상화가 새고있다. (+1) – Steven

+0

@jgauffin, 죄송합니다. 내 문제를 설명 할 수 없습니다. 이 예제가 설명 할 수 있습니다. 이 두 가지 제안 [예제 1] (http://www.codeproject.com/Articles/522226/ADO-NET-2cplustheplusrightplusway), [예제 2] (http://www.codeproject.com/Articles/543810)을 통합하고자합니다./Dependency-Injection-and-Of-Work-using-Castle) 또한 첫 번째 예는 기사입니다. 당신의 예제와 다른 것을 통합하고 싶습니다 ... –

+0

@ AliRızaAdıyahşi : 당신이 내 ADO.NET article =을 링크 한 것을 재밌 네요.) EF 나 NH가 사용되는지 서비스가 알아야하는 이유는 아직도 모르겠다. – jgauffin

1

당신은 Ninject으로 종속 인젝터를 사용하여 매개 변수 트로프 생성자에게

귀하의 NinjectModule를 주입 할 수

public class NinjectModule : NinjectModule 
{ 
    public override void Load() 
    { 
     this.Bind<ICategoryRepositoryEF>().To<CategoryRepositoryEF>(); 
     this.Bind<ICategoryRepositoryNH >().To<CategoryRepositoryNH>(); 
     this.Bind<ICategoryService >().To<CategoryService>(); 
    } 
} 

를 주입이 그냥 예를 들어 만 가지고있다

var kernel = new StandardKernel(new NinjectModule()); 
var categoryService = kernel.Get<ICategoryService>(); 

종속성 종속성을 고려하여 응용 프로그램의 구성 루트 (시작점)에 주입 할 수 있습니다.

관련 문제