2015-01-28 7 views
1

나는 현재 매우 분리 된 여러 가지 서비스를 가지고있다. 이제 나는 그것들을 확장시켜야하고 그들은 서로 접근하기 위해 의존 할 필요가있다. EmailService, HouseService, UserService, PriceService :서비스 계층과 상호 작용하는 서비스를 사용하는 최상의 아키텍처 설계?

의 내가 4 개 서비스 있다고 가정 해 봅시다. 각 사용자에게는 이메일 주소가 있으며 각 사용자는 집에 속합니다.

각 사용자에게 연결된 주택 가격에 대한 이메일을 보내고 싶습니다. 그래서 EmailService에 내가 PriceService에 SendEmailToAddress (문자열 이메일, 문자열 텍스트)을 가지고 나는 GetHousePrice (INT 아이디), HouseService에 내가 가진 GetUsersInHouse (INT 아이디)와 UserService에 내가 가진 GetEmailOfUser (INT ID가).

HouseController에서 모든 사용자에게 전자 메일을 보내는 가장 좋은 방법은 무엇입니까? 컨트롤러 액션에서 모든 서비스를 초기화하고 순서대로 각 서비스를 호출해야합니까, 아니면 중재자 패턴을 사용해야합니까? 만약 내가 그것을 사용해야한다면, 그것은 아마도 하나의 방법만을 포함 할 것이기에 약간의 과잉 공격이 될 것입니다. 또한 모든 곳에서 사용할 경우 각 서비스 연결마다 다른 조정자를 만들어야합니까? 그렇지 않으면 모든 서비스가 전용 속성으로 사용되는 하나의 클래스 여야하며 그런 다음 메서드에서 특정 작업을 한 번만 사용해야합니까? Mediator 패턴을 사용하면 모든 컨트롤러에서 사용해야하며 그렇지 않으면 함께 상호 작용할 필요가없는 곳의 베어 서비스를 사용해야합니다 (예 : 주택 목록 만 필요하면 그냥 가져 오는 것이 가장 좋습니다). Mediator 대신 서비스 개체에서 직접 가져옴)?

+0

데이터베이스 상호 작용을 위해 서비스 계층 위의 저장소 계층도 사용하고 있습니까? –

+0

그래, 나야. 그것은 어떤 차이를 만들까요? 트랜잭션을 제외하고 현명합니까? –

답변

0

정보를 검색하고 기존 서비스를 사용하여 메일을 보내도록 실제 논리가 포함 된 워크 플로 서비스를 만들 수 있습니다.

이 서비스는 HouseController에서 호출됩니다. 이 서비스를 클래스 라이브러리로 직접 사용하거나 WCF 서비스로 공개 할 수 있습니다. 하지만 그것은 당신의 요구 사항에 달려 있습니다.

이렇게하면 엔티티 서비스가 느슨하게 결합 된 상태로 유지되며 모든 교차 서비스 논리가 전용 구성 요소에 포함됩니다.

+0

서비스로 나는 서비스 계층, 디자인 패턴을 의미 : http://techbrij.com/generic-repository-unit-of-work-entity-framework-unit-testing-asp-net-mvc 여기에 그 예가있다. . –

0

저는 ASP.Net MVC에서 지난 2 일부터 모범 사례를 찾고 있었기 때문에 우리의 서비스에는 (다른 도메인 모델의 저장소를 사용하는) 모든 비즈니스 논리가 포함되어야하고 컨트롤러가 액세스 할 수있는 공용 메서드가 있어야한다고 결론을 내 렸습니다.

귀하의 경우에는 새로운 서비스를 만들고 계산의 모든 논리를 넣고 그 서비스의 방법으로 이메일을 보내야합니다. 그래서 당신의 서비스는 블랙 박스처럼 작동합니다. 프로젝트에서 작업하는 다른 개발자는 해당 방법으로 관리되는 방법을 알 필요가 없습니다. 필요한 매개 변수를 사용하여 해당 메소드를 호출하고 응답을 처리하는 것만 알면됩니다.

+0

네,하지만 질문은 그 때 최고의 장소는 무엇입니까? 그것은 집이나 사용자 중 하나에 갈 수 있습니다. 그리고 저는 아주 간단한 예를 들었습니다. 실제 문제는 7 개 또는 8 개의 서로 다른 서비스를 포함합니다. 요점은 코드를 전혀 복제하고 싶지 않다는 것입니다. 따라서 하나의 서비스에 넣으면 다른 서비스에서 적어도 하나의 메소드를 복제해야합니다. 이것이 중재자 패턴을 조사한 이유입니다. –

+0

그런 경우 저장소에서 메소드를 이동하고 두 서비스의 저장소에서 해당 메소드를 호출 할 수 있습니다. 서비스 메소드는 자신의 서비스 메소드 또는 다른 서비스 메소드라고해서는 안되며, 단지 저장소 메소드 만 호출하면된다. 이것은 제가 건축을 건축 할 때 그리고 그런 문제에 대해서 결론을 내린 것입니다. 이것은 완전히 내가 생각하는 것입니다, 거기에 더 나은 해결책이있을 수 있습니다. –

+0

그래, 이메일을 보낼 코드를 추가 ... 나도 몰라, 그것은 데이터베이스에 그들을 저장하는 데 사용되는 저장소에 넣어하는 것이 가장 좋습니다처럼 보이지 않습니다. 저장소를 사용하는 방법은 db를 저장하거나 가져 오는 것입니다. 이게 맞다고 생각하니? –

0

필요한 서비스가 포함 된 HouseServiceFacade 만 만들면됩니다. 이 정면에서 컨트롤러의 모든 방법을 사용할 수 있습니다.

0

서비스가 실제로 서로 통신 할 필요가 없다는 것을 감안할 때, 각각에 대해 다양한 메소드를 호출하고 상위 레벨 태스크를 완료하기 위해 리턴 값을 사용할 필요가 있습니다. 중재자 패턴이 적절하지 않다고 생각합니다. 이리.

예를 들어 PriceService가 관리하는 객체의 상태를 조작하려면 HouseService가 필요하지 않습니다.그냥 HouseService가 입력을 제공하는 PriceService에서 데이터를 필요로 대신

var houseId = houseService.GetIdOfHouse(someCriteria); 
var price = priceService.GetPriceOfHouse(houseId); 

, 난 당신이 구현해야 어떻게 생각 인 것 외관 패턴 :

가에 통합 된 인터페이스를 제공합니다 서브 시스템의 인터페이스 세트. Façade는 하위 시스템을보다 쉽게 ​​사용할 수있게 해주는 상위 인터페이스를 정의합니다.

Facade 패턴의

좋은 예는 dofactory.com 사이트에서 찾을 수 있습니다 : 컨트롤러에서

public class NotificationFacade 
{ 
    private IPriceService _priceService; 
    private IHouseService _houseService; 
    private IUserService _userService; 
    private IEmailService _emailService; 

    public NotificationFacade(IPriceService priceService, IHouseService houseService, IUserService userService, IEmailService emailService) 
    { 
     _priceService = priceService; 
     _houseService = houseService; 
     _userService = userService; 
     _emailSerice = emailSerice; 
    } 

    public void NotifyUsersAboutPriceForHouse(int houseId) 
    { 
     var price = _priceService.GetHousePrice(houseId); 
     var users = _houseService.GetUsersInHouse(houseId); 
     foreach(var user in users) 
     { 
      var emailAddress = _userService.GetEmailOfUser(user); 
      _emailService.SendEmailToAddress(emailAddress, "Your House Price is:" + price); 
     } 
    } 
}   

: 여기

http://www.dofactory.com/net/facade-design-pattern

내가하는 일이라고 생각 무엇

public HouseController 
{ 
    private NotificationFacade _notificationFacade; 
    public HouseController(NotificationFacade notificationFacade) 
    { 
     _notificationFacade = notificationFacade; 
    } 

    public void SomeActionMethod(int houseId) 
    { 
     _notificationFacade.NotifyUsersAboutPriceForHouse(houseId); 
    } 
}  

종속성은 Unity, Ninject, StructureMap 또는 이와 유사한 컨테이너와 함께 Dependency Injection을 사용하여 해결해야합니다 ...