2009-08-29 7 views
0

私はモデルクラスをインターフェイスに再組み込みしています。モデルクラスは、Linq-to-SQLを使用して自動生成されます。デカップリングのためにLinq-to-Sqlでインターフェイスを使用する

class FooRepository 
{ 
    // ... 
    public void Add(IFoo foo) 
    { 
     db.Foos.InsertOnSubmit(foo);  
    } 
} 

InsertOnSubmitメソッドは、IFooではなくFooのインスタンスを取ります。私はインスタンスをインラインで(Foo)にキャストすることができますが、これは機能しますが、これを行うにはよりクリーンな方法がありますか?

私は既にStructureMapを使用していますが、Addメソッドに属性を追加して、自分のマッピングに基づいて型を解決できますか?

モデルクラスのメソッドをオーバーライドするか、部分的なイベントを使用してこれを行うことはできますか?

答えて

1

DLINQモデルをコントローラから分離するために、LINQモデルを回避する傾向がありますが、コントローラで使用される別のモデルがあるため、DLINQメソッドを呼び出す前にクラスに渡されます。

この方法では、データベースに利用可能な他の多くのプロパティがあるかもしれませんが、この方法ではアプリケーションで必要なプロパティだけをコントローラに入れることができます。

このように、データベース構造がFooRepositoryなどのDAOクラスのみを変更する必要がある場合は、変更する必要があります。その他はすべてリップルエフェクトから保護されています。

このようなことをしたいのかどうかわかりませんが、期待しているインターフェイスを使用するよりも簡単なデザインになります。

+0

私のコントローラは、モデル用のインターフェイスを使用してViewModelオブジェクトに変換します。私は、データアクセス/リポジトリ領域以外のLINQモデルを使用せず、異なるクラスにマッピングしていることを聞いています。インタフェースを使用することで、ある領域での変更を管理し、他の領域に影響を与えないようにするための柔軟性が大幅に向上しました。 – blu

+0

+1しかし、それは悪い答えではない、ちょうど私が今探しているものではない。 – blu

+0

インターフェイスのプロパティを定義してから、クラスのプロパティを定義するのが理想的です。私は使用する傾向がある クラスユーザー{ public String Name {get;セット; } } インターフェイスのクラスがインターフェイスと同じになります。 –

0

もしこれが合うのであればダンノーだろうが、おそらくジェノリックを使ったアイデアだろうか?

class FooRepository<T> 
where T: class, IFoo, new() 
{ 
    // ... 
    public void Add(T foo) 
    { 
     db.Foos.InsertOnSubmit(foo);  
    } 
} 

そして、あなたはこのような何か行うことができます -

Foo bar = new Foo(); 
FooRepository<Foo> foo = new FooRepository<Foo>(); 
bar.Add(bar); 

またはこの...

Bar bar = new Bar(); //Bar implements IFoo 
FooRepository<Bar> foo = new FooRepository<Bar>(); 
bar.Add(bar); 

その方法を、FooRepositoryでTは実際にはFoo(またはバー)で、 IFooではなくキャスティングは必要ありませんが、where句の制限は、Foo(とBar)が実行するIFooを実装する必要があることを意味します。

関連する問題