2

서비스 로케이터 패턴을 사용하는 DDD 데이터 계층이있는 프레임 워크가 있습니다. 그러나 현재 모든 참조를 저장하는 전역 정적 ServiceLocator 클래스를 사용합니다. 클래스가 IServiceProvider 인터페이스를 구현하고 전역 고정 ServiceLocator 클래스를 제거하는 올바른 구현으로 리팩토링하고 싶습니다.서비스 로케이터 패턴 및 DDD

이제 거의 모든 곳에서 엔티티 클래스를 제외하고 IServiceProvider 인터페이스로 기존 클래스를 확장하는 데 문제가 없습니다. 문제는 엔티티 클래스가 IServiceProvider을 구현해야한다는 것이 매우 이상하다고 생각하지만, IoC 컨테이너를 통해 리포지토리를 해결할 수있는 서비스 제공 업체에 액세스하는 방법이 필요합니다.

엔터티에 IServiceProvider을 구현하지 않아도 서비스 로케이터 패턴을 구현하는 가장 좋은 방법은 무엇입니까?

+1

추천하는 패턴에 대한 링크를 게시 할 수 있습니까? – jgauffin

+0

Google은 좋은 결과를 가지고 있습니다. http://www.google.com/search?q=service%20locator%20design%20pattern http://stefanoricciardi.com/2009/09/25/service-locator-pattern-in-csharpa-simple-example/의 시리즈는 좀 더 자세히 설명합니다. 내가 특별히 없애려고하는 것은 싱글 톤 패턴입니다. –

+0

네, 그렇다고해도 제멋대로입니다. 이 패턴의 아무 것도 모든 엔터티가 IServiceProvider를 노출하지 않게합니다. – TomTom

답변

3

엔터티 (비즈니스 개체)가 IServiceProvider를 노출하는 이유는 무엇입니까? 그것은 서비스가 아닌 비즈니스 객체입니다. 그리고 IServiceProvider는 서비스조차도 아니며 서비스 공급자를 노출하는 IOC 메커니즘입니다.

ORM/비즈니스 오브젝트 프레임 워크/런타임은 서비스 제공자이지만 개별 엔티티는 아닙니다.

질문 : 나는 엔티티가 IServiceProvider를 처음으로 노출시키는 현명한 프로그래밍 개념을 보지 못합니다.

--- 만 서비스 로케이터를 제공해야

서비스를 업데이트 - 당신이 하나 있어야합니다. 정의 된 스레드가 요소에 액세스하는 경우 (예 : UI - UI 요소는 UI 스레드에 의해 스펙에 의해 액세스되어야 함) 전역 단일 톤을 손상시키는 경우에 스레드 정적 변수를 사용할 수 있습니다.

+0

전 세계 어디에서나 사용할 수 있어야하는 글로벌 서비스 (예 : 인증)가 있기 때문입니다. –

+0

예,하지만 엔티티가 아니며 서비스입니다. 또한 tehy는 IServiceLocator를 구현하지 않지만 ServiceLocator를 통해 노출됩니다. DependentInjector 나 다른 중앙 컴포지션 컨테이너/서비스 로케이터 (예 : 창당)를 사용하여 도망 갈 수는 있지만 모든 엔터티가 하나로 변하는 패턴이 없습니다. – TomTom

+0

하지만 비즈니스 논리에서 그들을 필요로합니다. 문제는 비즈니스 논리에서 이러한 서비스에 액세스 할 수있는 좋은 방법이 필요하다는 것입니다. –

3

서비스 검색기는 Unity, Castle Windsor 또는 NInject와 같은 Inversion of Control 컨테이너와 함께 사용하는 것이 가장 좋습니다. Unity와 함께 작동하는 서비스 위치 지정자의 예는 http://commonservicelocator.codeplex.com/wikipage?title=Unity%20Adapter&referringTitle=Home&ProjectName=commonservicelocator을 참조하십시오.

서비스 로케이터는 반 패턴으로 간주 될 수 있으므로 매우 신중하게 사용해야합니다. 대신 생성자 또는 속성 주입을 사용하는 것이 훨씬 좋습니다. 그러나 종속성이 실행되는 기능에 크게 의존하는 경우 Service Locator가 있습니다.

+0

Castle Windsor를 사용합니다. 그러나, 나는 모든 의존성을 통과시키는 것이 가능하다고 생각하지 않는다. 항상 생성자. 서비스 로케이터 패턴을 여러 글로벌 서비스에 대해 특별히 사용합니다. 권한 부여. –

+0

이제까지 스레드 정적 접근자를 사용하려고 생각 해 보셨습니까? 또는 포스트 구성을 속성에 사용하려면 - 항상 그렇게합니다 (나중에). – TomTom

+0

@TomTom : 나는 포스트 구성으로 인해 내가 소유하고 있지 않은 물건으로 엔티티를 오염시키고 있다는 것을 의미한다고 생각합니다. 스레드 정적 접근자가 갈 수있는 방법이라고 생각합니다. 대답을 업데이트하면 받아 들일 것입니다. –

0

귀하의 의견에 Service Locator 패턴을 언급하고 있습니다. 그에 따라 질문을 수정하십시오.

오늘날 대부분의 응용 프로그램은 Service Locator 패턴 대신 Dependency Injection Principle (SOLID 원칙의 D)을 사용합니다. DIP를 시작하는 가장 쉬운 방법은 Autofac과 같은 컨트롤 컨테이너의 반전을 사용하는 것입니다.

서비스 로케이터의 아이디어는 서비스를 검색하는 데 사용되는 클래스가 있다는 것입니다. 이를 위해서는 모든 서비스를 등록하기위한 일종의 등록 메커니즘이 필요합니다.

일반적인 시작 :

serviceLocator.Add(new MyService()); 

그리고 나중에 사용

serviceLocator.Get<MyService>(); 

나는 당신이 클래스가 가지고 종속성이 많은 명확하게하는 만드는 대신 이후 DIP를 사용하는 것이 좋습니다 않습니다.

+0

질문이 업데이트되었습니다. –

관련 문제