2016-09-26 8 views
3

エンティティフレームワークを使用する場合、リポジトリをコントローラに挿入するのは悪い習慣ですか?私がサービスしている場合たとえばリポジトリはコンストラクタを介して注入するか、または?

は:

public void CreateDog(string name, IMyDbContext myDbContext) 
{ 
    using(myDbContext) 
    { 
      //create a dog using the myDbContext 
    } 
} 

public class DogService 
{ 
    IMyDbContext _myDbContext; 
    public DogService(IMyDbContext myDbContext) 
    { 
     _myDbContext = myDbContext; 
    } 


    public void CreateDog(string name) 
    { 
     //create a dog using the myDbContext 
    } 
} 

を我々が明示的にリポジトリを処分されていない、そしてそれを行うには良いだろうので、上記のは悪い習慣だろうmydbcontextのstucture:私はを処分するにはどうすればよい

public class MyDbContext : DbContext, IMyDbContext {} 

myDbContext?

+2

通常、コンテキストを「挿入」しません。コンテキストが作成され、使用され、破棄されます。より一般的には、_repository_などが注入され、コンテキストが使用されます。 –

+0

ありがとうございました。ご質問ありがとうございました –

+2

もう一つの質問に答えるために、ディスポーザブルオブジェクトが何かを作成するのが一般的です。別のクラスに注入すると、複雑になります。 –

答えて

1

はい、リポジトリ・パターンを使用すると、リポジトリ・インタフェースを挿入できます。コントローラーのコンストラクターを使って注入することができます。リポジトリの

寿命:

すべてのリポジトリインスタンスが一時的なものです。つまり、使用ごとにインスタンス化されます。コンテキストの処分について心配する必要はありません。

これは例です:これはリポジトリパターンです。あなたはリポジトリのインタフェースを注入する必要があります。この例ではサービス層を使用していますが、コントローラでも同様に行うことができます。

public class PersonAppService : IPersonAppService 
{ 
    private readonly IRepository<Person> _personRepository; 

    public PersonAppService(IRepository<Person> personRepository) 
    { 
     _personRepository = personRepository; 
    } 

    public void CreatePerson(CreatePersonInput input) 
    {   
     person = new Person { Name = input.Name, EmailAddress = input.EmailAddress }; 
     _personRepository.Insert(person); 
    } 
} 

あなたはここでそれについての詳細を読むことができます:Repositories

+0

ランダムなプログラミング関連の用語を強調表示するために ''インラインコード ''を使わないでください。あなたの記事をより読みやすくすることはありません。 「コード以外のテキストにコードを使用するときはいつですか?」(http://meta.stackoverflow.com/questions/254990/when-should-code-formatting-be-used-for-non-code-text)も参照してください。 )。 – CodeCaster

+1

@コードキャスターありがとうございます、ありがとうございます。私はこれがあなたがこのアドバイスをした2回目だと思っています。私はここにそれを追いかけます:) – Sampath

-2

をあなたはDogServiceがIDisposableインターを実装してみましょうとDogServiceのDisposeメソッドからmyDbContext.Dispose()を呼び出すことができます。

+0

誰がそのDisposeと呼ぶでしょうか? –

+1

@MrinalKamboj使用ブロック内にDogServiceのインスタンスを作成すると呼び出されます: – user1796440

+1

依存関係注入を理解しておらず、実行可能であればOPがこの長い時間を返したでしょう –

2

主な質問 - 、Ninject IOCを使用して、次のことは助けになる場合は、[はい、それは

を配置され得るんかはい、それは、注入することができるならば、Dependency Injectionを使用してDBcontextを注入することをお勧めだろう:

kernel.Bind<DBContext>().ToSelf().InRequestScope(); 

チェックアウト次linkを、それがパターンの両方を記述しても、単一のDBcontextを作成する方法についての詳細を提供しますそのプロセスで何台のコントローラが呼び出されても、HttpRequestになります。

別の有用なリンクHow to handle DBContext when using Ninject

+0

もちろんNinject 。生涯管理はDIコンテナの責任となります。 –

+0

@HenkHoltermanが合意したこと理想的にはそうであるが、多くのDIフレームワークが浮かんでいるので、私はブランケットの主張はほとんど変わっていない。私はNinjectのような人気のあるものを使っている。 –

関連する問題