2011-02-01 10 views
2

あなたはIoCのを使用しているが、以下のような他の方法と一緒にその中の静的メソッドがある状況に対処するための最良の方法は何ですか:ユニティのIoCとstaticメソッド

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に依存しなくなります。