2011-10-29 18 views
0

私のプロジェクトでは、Unity 2.0をasp.net mvc3と併用しています。私がRepositoryクラスにTestEntities : ObjectContextを設定しようとすると、例外がスローされます。Unity 2.0 IOC with Entity Framework

public class UserRepository:IUser 
{ 
    //TestEntities ctx = new TestEntities(); 
    [Dependency] 
    public TestEntities ctx { get; set; } 
    //... 
} 

これは例外メッセージれる:

型TestEntitiesは長明確化することができません1の複数のコンストラクタを有します。

XML構成:

<?xml version="1.0" encoding="utf-8" ?> 
<unity xmlns="schemas.microsoft.com/practices/2010/unity"> 
    <container> 
     <register type="DomainModel.Entity.TestEntities, DomainModel" 
        mapTo="DomainModel.Entity.TestEntities, DomainModel"> 
      <lifetime type="perthread"/> 
     </register> 
     <register type="DomainModel.Abstract.IUser, DomainModel" 
        mapTo="DomainModel.Concrete.UserRepository, DomainModel"> 
      <lifetime type="perthread"/> 
     </register> 
    </container> 
</unity> 
+0

ごめんなさい。 – user1019359

答えて

3

完全に誤った構成です。まず、スレッドごとの存続期間を使用しています。スレッドごとの有効期間は、自分でスレッドを制御するシナリオですが、ASP.NET MVCではそのような制御はありません。 ASP.NET MVCは内部的にスレッドプールを使用するので、スレッドは後続のリクエストで再利用されます。コンテキストはリクエスト間で再利用され、a lot of problemsが発生します。もう1つの問題は、スレッドごとの存続期間がコンテキストのそれゆえであることです(スレッドライフタイムがあなたのコントロールの下になければかなり難しいです)。あなたのアプリケーションは大きなメモリリークで十分です。ごとの解決

  • あなたは別の寿命管理を使用しなければならないことは、新しいインスタンスを毎回作成されますあなたは、コンテナにResolveを呼び出しますが、依存関係の階層の場合、同じインスタンスが、すべての注射のために使用されます。あなたは文脈の処分を自分で処理しなければなりません。

  • Transient:Resolveを呼び出すたびに新しいインスタンスが作成されます。依存関係の階層中にインスタンスが複数回必要な場合は、各注入に対して新しいインスタンスが作成されます。あなたは文脈の処分を自分で処理しなければなりません。
  • 階層型:要求の処理ごとに新しいサブコンテナを作成し、このサブコンテナのインスタンスを解決する必要があります。そのサブコンテナインスタンスでResolveを呼び出すたびに、同じインスタンスが使用されます。要求が終了すると、サブコンテナを破棄しなければならず、階層ライフタイムを持つすべてのインスタンスも廃棄されます。
  • this per-request exampleのようなカスタムライフタイムマネージャが、正しい依存性注入構成を使用する必要はありません。解決単位または階層管理者は、すべての要件を解決する必要があります。

生涯の別のマネージャの詳細はmy articleです。

TestEntitiesクラスで問題が発生しました。 Unityは、デフォルトでは、最大数のパラメータを持つコンストラクタを使用して、依存性注入を使用してこれらのパラメータを解決しようとします。そのようなコンストラクタが複数見つかると、どちらを選択するかわからないのでこのエラーがスローされます。このようなコンストラクタの依存関係が解決されないため、1つしか存在しなくてもエラーが発生します。どのコンストラクタを呼び出すかをUnityに明示的に伝える必要があります。これはUnityに強制的にデフォルトのコンストラクタを使用させます:

<register type="DomainModel.Entity.TestEntities, DomainModel" 
      mapTo="DomainModel.Entity.TestEntities, DomainModel"> 
    <lifetime type="perresolve"/> 
    <constructor /> 
</register> 
+0

ありがとうございました。 「コンテキストの処分を処理する」についての詳細を教えてください。 – user1019359

+0

コンテキストが単一の論理操作(作業単位)のためだけに使用される必要があるので、それをもう必要としないとコンテキストを破棄する必要があります。たとえば、WebアプリケーションやWebサービスでは、通常、リクエストごとに単一のコンテキストがあります。フォームアプリケーションでは、フォームまたはプレゼンターごとに1つのコンテキストを持つことができます。 –

+0

ありがとうございます。 別の質問をチェックする時間があれば本当にありがたいです。 [link](http://stackoverflow.com/questions/7953635/unity-2-0-ioc-configuration-about-generic-class) – user1019359