2

ASP.NET MVC で Ninject を使用する場合、サードパーティの依存関係を抽象化する最良の方法は何ですか?

通常、私は次のようなことをします:

public interface IProductRepository
{
    IEnumerable<Product> GetProducts();
}

public class ProductRespository : IProductRepository
{
    public IEnumerable<Product> GetProducts()
    {
        ...
    }
}

そして、コントローラーで:

public class ProductController : Controller
{
    private IProductRepository repository;

    public ProductController(IProductRepository repository)
    {
        this.repository = repository;
    }

    ...
}

次に、Ninject を使用して、ソリッド ProductRepository をコントローラーに自動的に挿入します。

しかし、依存関係がサードパーティの場合、どうすればよいですか? たとえば、私はFlickrNetを使用しています。

public class ProductController : Controller
{
    private Flickr flickr;

    ...
}

Flickr依存性注入を使用して単体テストを容易にするために、オブジェクトをインターフェイスに抽象化できるようにしたいと考えています。「サービス」タイプのインターフェースを作成し、それに基づいて Flickr オブジェクトをラップするクラスを実装できることはわかっています。

しかし、Flickr オブジェクトの各メンバーに対応するインターフェイスでメンバーを定義し、ラッパー オブジェクトでこれらの各メンバーをマップする必要があります。そして、Flickr オブジェクトには非常に多くのメンバーがいます。

これに対処するより良い方法はありますか?私の主な目標は、単体テストで Flickr の依存関係を簡単にモックできるようにすることです。

4

4 に答える 4

3

コメントを回答にア​​ップグレードしました。

これは DI の問題ではなく、一般的なアーキテクチャの問題です。コントローラーを抽象レイヤーとして宣言するか、カスタム インターフェイスを実装する flickr コンポーネントのラッパーを定義することができます。サード パーティ コンポーネントのメソッドがより多くのサード パーティ クラスを消費する場合は、プリミティブ値のみになるか、サード パーティ コードのラッパーが増えるまで、それらを抽象化する必要があります。そのコンポーネントの複雑さによっては、これは多くのマッピングとラッピングを意味する可能性があります。

于 2012-08-09T09:54:15.760 に答える
2

ラッパーが正しい方法だと思います。サード パーティ オブジェクトのすべてのメンバーを公開する必要はありません。必要なものだけを公開します。さまざまな状況に応じてさまざまなインターフェイスを使用することで、ラッパー ソリューションはさらに優れたものになります。

于 2012-08-09T08:03:46.933 に答える
1

この記事が単体テストに関するものではないことは承知していますが、この記事で提供されるソリューションは、模擬ベースの単体テストにもうまく機能します。

http://goodcoffeegoodcode.blogspot.com/2011_04_01_archive.html

基本的に、@Brian Dishaw が示唆したように、FlickrNet クラスからインターフェイスを抽出し、それらをクラスに注入する必要があります。

于 2012-08-09T03:53:56.663 に答える
1

唯一の目的は、flickr .NET をより高い抽象化レイヤーに抽象化する場合です。例えば

interface IAlbumViewer
{
   IEnumerable<IImage> GetImages();
}

interface IPictureUploader
{
   string Upload(string filename, Stream image)
}

つまり、一般的な flickr インターフェイスではなく、ユースケースに固有のインターフェイス/メソッドを作成します。また、他の画像サービスのサポートを追加するのがはるかに簡単になるため、その恩恵を受けることもできます.

于 2012-08-09T14:23:53.650 に答える