1

SimpleInjector 및 MVC를 사용하는 사이트가 있고 구조적으로 잘못 될 위치를 확인하려고합니다.생성자에서 서비스가있는 전역 필터 용 DI 컨테이너 구성

public static class DependencyConfig 
{ 
    private static Container Container { get; set; } 

    public static void RegisterDependencies(HttpConfiguration configuration) 
    { 
      *snip* 

     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters, Container); 
    } 
} 

을 그리고 내 RegisterGlobalFilters은 다음과 같습니다 :

내 DI 컨테이너가이 설정되어 매장 내 키오스크 나에 (이 웹 사이트를 통해)

public static class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters, Container container) 
    { 
     filters.Add(new HandleErrorAttribute()); 

     filters.Add(container.GetInstance<OrderItemCountActionFilterAttribute>()); 

     if (container.GetInstance<ISiteConfiguration>().ConfiguredForExternalOrders) 
     { 
      filters.Add(container.GetInstance<StoreGeolocationActionFilterAttribute>()); 
     } 

     filters.Add(container.GetInstance<StoreNameActionFilterAttribute>()); 
    } 
} 

가게가 취할 수있는 주문 집에서 온라인으로. 외부 주문은 가장 가까운 상점과 관련하여 정보를 고객에게 표시하기 위해 위치 정보를 지정해야합니다. 그러나 이것은 글로벌 필터에서 서비스 로케이터로 컨테이너를 사용해야한다는 것을 의미합니다. 즉, DI 컨테이너의 전역 필터에 대한 호출을 숨겨야합니다. 이 모든 것은 나에게 반 패턴을 닮거나이 일을하는 더 좋은 방법이되어야한다고 생각합니다.

답변

0

시스템 아키텍트와 약간의 논의 끝에, 우리 아키텍쳐에 대한 가장 좋은 대답은 DI 컨테이너에 RegisterCorporateWebSiteDependencies()와 RegisterStoreWebsiteDependencies()라는 두 개의 Register 함수를 생성하는 것이 었음을 결론 지었다.().

자연 확장은 또한 RegisterCorporateGlobalFilters()와 RegisterStoreGlobalFilters()에 대해 하나씩 종속성 구성 후 호출되는 두 개의 전역 필터 구성을 갖습니다. 문이 레지스터의 예를 실행하는 경우

이 하나 개의 전체 결과 : 훨씬 더 간단하고 혼동 될 수있는 다른 위치에서 논리를 제거

if (Convert.ToBoolean(ConfigurationManager.AppSettings["IsCorporate"])) 
{ 
    DependencyConfig.RegisterCorporateWebSiteDependencies(GlobalConfiguration.Configuration); 
} 
else 
{ 
    DependencyConfig.RegisterStoreWebSiteDependencies(GlobalConfiguration.Configuration); 
} 

합니다.

3

인스턴스를 해결하기 위해 컨테이너를 구성하고 호출하는 방법에 실제 문제가 없습니다 (이 모든 작업이 composition root에서 수행되는 한).

내가 본 기본 문제는 사용 의도가없는 방식으로 Attributes을 사용하고 있습니다. 이 주제에 대한 유용한 읽기는 에 Steven의 게시물이고 Passive AttributesMark Seemann의 게시물입니다. 이 게시물의 제안을 따르려면 필자가 훨씬 더 행복해하는 코드로 끝날 것입니다.

또한 MVC 속성의 단독 특성과 관련하여 Steven here에 의해 제기 된 최근 질문을 참조하십시오.

+0

나는 Ploeh 블로그를 읽었는데 그 항목을 완전히 놓쳤지만 MVC 및 전역 필터를 구현하는 방법을 결정할 수없는 것처럼 보입니다. 제 생각에는이 링크 텍스트가 없기 때문에이 답변이 링크 전용 답변으로 표시 될지 걱정됩니다. –

+0

@CBauer 댓글이 너무 길었습니다. [Steven의 블로그] (https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=98)에 대한 실례가 있습니다. – qujck

+0

Steven의 블로그 게시물은 MVC가 아닌 WebApi 용 코드입니다. –

관련 문제