2011-02-01 1 views
2

:유니티의 IoC와 정적 방법은 IOC의를 사용하는 상황을 처리하는 가장 좋은 방법이지만 다음과 같은 다른 방법과 함께 그 안에 정적 방법이 무엇

public partial class ShoppingCart 
{ 
    private IDatabaseFactory _storeDB; 

    public ShoppingCart(IDatabaseFactory storeDB) 
    { 
     _storeDB = storeDB; 
    } 

    private string ShoppingCartId { get; set; } 

    public static ShoppingCart GetCart(HttpContextBase context) 
    { 
     var cart = new ShoppingCart(WHATGOESHERE?); 
     cart.ShoppingCartId = cart.GetCartId(context); 
     return cart; 
    } 

    public int OtherMethod() 
    { 
     ... 
    } 
} 
+5

왜 'HttpContext'가 DAL 계층으로 전달됩니까? –

+0

샘플에서 발췌 문장으로 작업하고 있습니다. – Mike

+0

다니엘 에이 화이트 (Daniel A White)가 지적했듯이, 이것은 나쁜 생각입니다. IoC는 때때로 이런 나쁜 아이디어를 드러내는 경향이 있습니다. –

답변

0

IMO 당신이해야이 그것은 다음과 같이 할 수있게, 리팩토링 :

public class ShoppingCartService { 
    private readonly IDatabaseFactory _storeDB; 

    public ShoppingCartService(IDatabaseFactory storeDB) { 
     _storeDB = storeDB 
    } 

    public ShoppingCart GetCart(IdType cartId) 
    { 
     var cart = new ShoppingCart(_storeDB); 
     cart.ShoppingCartId = cartId; 
     return cart; 
    } 
} 

public partial class ShoppingCart 
{ 
    private IDatabaseFactory _storeDB; 

    public ShoppingCart(IDatabaseFactory storeDB) 
    { 
     _storeDB = storeDB; 
    } 

    private string ShoppingCartId { get; set; } 

    public int OtherMethod() 
    { 
     ... 
    } 
} 

이 방법, 당신은 당신이 프레젠테이션 층에 주입 할 수있는 서비스 클래스에 정적 메서드에서 현재 쇼핑 카트를 얻기 위해 책임을 이동하고있다.

2

정적 인 GetCart 방법은 Ambient Context입니다. 특히 도메인 모델 수준에서 이러한 방법을 사용하는 것은 바람직하지 않습니다. 추상 공장에 리팩토링보십시오 :

public interface IShoppingCartFactory 
{ 
    ShoppingCart GetCartForCurrentUser(); 
} 

당신이 (그러나 당신의 엔티티에, 그것은 깨끗하게 엔티티를 유지하는 것이 좋습니다)가 필요 서비스에 IShoppingCartFactory를 삽입 할 수 있습니다. 이제 구현을 정의하고 IoC 구성에 등록 할 수 있습니다. 이러한 구현 예는 다음과 같습니다.

쇼핑 카드 팩토리에서 사용자 컨텍스트를 가져 오는 것이 더 낫습니다. 예를 들어, 쇼핑 카드 팩토리에 IUserContextFactory을 삽입하면 ASP.NET에서 독립적입니다.

관련 문제