2011-01-05 22 views
0

私は、C#と.netを使ってリポジトリパターンを試しています。リポジトリパターンを使用してオブジェクトの新しいインスタンスを作成する正しい方法は何ですか?

私の質問についてはsomeRepositoryObjectの新しいインスタンスを作成しています。私がこれまで見てきたすべての例では、このようなものを使用します。

using(ISomeRepository someRepository = new SomeRepository().getRepository()) 
{ 
    IsomeRepositoryObject repObj = new someRepositoryObject(); 
} 

は、最初の場所でのインターフェイスを使用してのポイントを削除new someRepositoryObjectを呼び出しませんか?それが良いような何かをするだろう:

using(ISomeRepository someRepository = new SomeRepository().getRepository()) 
{ 
    IsomeRepositoryObject repObj = someRepository.NewsomeRepositoryObject(); 
} 

だから、タイプISomeRepositoryObjectであるだけという、リポジトリ自体は必要なオブジェクトの新しいインスタンスを返し、呼び出し元のコードがそれに渡されるクラスの知識を持ちません。

これは私にとって初めてのものなので、明白なものがありません。

ご協力いただければ幸いです。

+0

。getRepository()'だけでなく '新しいSomeRepositoryの()'や 'RepositoryFactory.getSomeRepositoryのようなもの()'あるいは 'SomeRepository.getRepository()'? – hangy

+0

それについて考えると、理由はありません!私はgetRepositoryを使って正しいリポジトリタイプを返すために使用されたweb.config appsettingを取得していました。このコードはSomeRepositoryのコンストラクタに追加できます。 –

+0

実際には、コードを見て、私は.getSomeRepository()を使ってIsomeRepositoryオブジェクトを返していました。これは私がクリスマス休憩前に演奏していたものです。 –

答えて

0

通常、私は説明した2番目の方法を使用しており、リポジトリに新しいインスタンスを作成させます。その理由は、あなたが言及したように、私はインターフェイスの実装をリポジトリを使用するコードから分離しようとしているからです。

0

IOCコンテナを使用して対応します。

Ninjectはこれに対する素晴らしい解決策です。例えば、私のMVCのプログラムでは、すべての私のコントローラは、いくつかのサービスが必要です。IServiceはNinjectによって注入され

public class SampleController: Controller { 
    public SampleController(IService service) {} 

} 

を、唯一global.asax.csは、具象クラスを確認する必要があります。

0

ここまでで説明したのは抽象的な工場パターンです。 リポジトリの場合は、IoCコンテナを使用して新しいオブジェクトを作成する方がよいでしょう。この場合、新しいキーワードはまったく使用されず、抽象化のみで作業します。ただ、好奇心、なぜ `新しいSomeRepository()のうち Repository by Martin Fowler

関連する問題