5

Unityを使用して、毎回新しいインスタンスを使用してリポジトリにデータコンテキストを自動的に注入しようとしています..、私の考えは、新しいデータコンテキストが注入されるたびに確実にすることです

現在、リポジトリの作成に失敗しています。MyDataContext を解決できないと思います

「リポジトリ」(以下を参照) にコンストラクターを作成してリポジトリの DataContext を取り込む前は、すべてが機能していましたが、現在は失敗しています..

私は現在、global.asaxで作成したユニティコンテナにこのセットアップを持っています。標準のDataContextであるMyDataContextタイプも登録しました

        container = new UnityContainer();

        Container.RegisterType<MyDataContext, MyDataContext>()
            .RegisterType<IOfficeRepository, OfficeRepository>()
            .RegisterType<IOfficeService, OfficeService>();

基本的に私はそのようにリポジトリを呼び出すサービスを持っています

public class OfficeService : IOfficeService
{

    IOfficeRepository repository = null;

    public OfficeService(IOfficeRepository repository)
    {
        this.repository = repository;

        if (this.repository == null)
            throw new InvalidOperationException("Repository cannot be null");
    }

ここに私のリポジトリがあります

public class OfficeRepository : IOfficeRepository
{
    private MyDataContext db;

    public OfficeRepository (MyDataContext dataContext)
    {
        this.db = dataContext;
    }

編集

サービスを作成するためにこれを行っていることをほとんど忘れていました

officeService = Bootstrapper.Container.Resolve<IOfficeService>();

編集 - 生成されるエラー

 Resolution of the dependency failed, type = "MarkSmith.IOfficeService", name = "".
 Exception message is: The current build operation (build key Build 
 Key[MarkSmith.OfficeService, null]) failed: The parameter repository could not be 
 resolved when attempting to call constructor 
 MarkSmith.OfficeService(MarkSmith.IOfficeRepository repository). (Strategy type BuildPlanStrategy, index 3)

編集 - リポジトリ作品のコンストラクターの削除

DataContext を使用するリポジトリのコンストラクターを削除すると、すべてが機能するため、datacontext と関係がありますが、毎回「NEW」datacontext を注入できるようにするには、DataContext を受け入れる必要があります。

public class OfficeRepository : IOfficeRepository
{
    private MyDataContext db new MyDataContext(); // CHANGE

    //public OfficeRepository (MyDataContext dataContext)
    //{
        //this.db = dataContext;
    //}

編集 - 実際のエラー

さらに深く掘り下げた後、このエラーが見つかりました....

The type MyDataContext has multiple constructors of length 2. 
Unable to disambiguate. (Strategy type DynamicMethodConstructorStrategy, index 0)
(Strategy type BuildPlanStrategy, index 3)

編集 - 1 行のコードで DATACONTEXT を解決するためのテスト

これも上記と同じエラーで失敗します - 複数のコンストラクター

  MyDataContext test = Bootstrapper.Container.Resolve<MyDataContext >();

編集 - DATACONTEXT のすべてのコンストラクター

これらは外部ユーティリティによって作成されましたが、すべて問題ないはずです..

    [System.Diagnostics.DebuggerNonUserCode]
    public MyDataContext()
        : base(ConnectionString, mappingCache)
    {
        OnCreated();
    }

    [System.Diagnostics.DebuggerNonUserCode]
    public MyDataContext(string connection)
        : base(connection, mappingCache)
    {
        OnCreated();
    }

    [System.Diagnostics.DebuggerNonUserCode]
    public MyDataContext(System.Data.IDbConnection connection)
        : base(connection, mappingCache)
    {
        OnCreated();
    }

    [System.Diagnostics.DebuggerNonUserCode]
    public MyDataContext(string connection, System.Data.Linq.Mapping.MappingSource mappingSource)
        : base(connection, mappingSource)
    {
        OnCreated();
    }

    [System.Diagnostics.DebuggerNonUserCode]
    public MyDataContext(System.Data.IDbConnection connection, System.Data.Linq.Mapping.MappingSource mappingSource)
        : base(connection, mappingSource)
    {
        OnCreated();
    }

編集 - Unity を使用せずにコードで DataContext を作成することを示すには、問題なく 100% 動作します

   MyDataContext tes2t = new MyDataContext ();
4

3 に答える 3

10

これが機能するかどうかはわかりませんが、MyDataContextを型マッピングではなくコンポーネントとして登録しようとしましたか?

container.RegisterType<MyDataContext>();

それ以外の

container.RegisterType<MyDataContext, MyDataContext>();

新しい情報に基づいて編集

原因は、MyDataContextに複数のコンストラクターがあることのようです。これは、ほとんどのDIコンテナに共通の問題です。これは、1つだけを選択して使用する必要があるためです。MyDataContextにコンストラクターが1つだけになるように制約することであいまいさを取り除くことができれば、それがおそらく最も簡単な解決策になります。

それ以外の場合は、リポジトリを登録するときに、InjectionConstructorインスタンスを使用してコンストラクターを識別できるはずです。接続文字列を引数として取るコンストラクターを使用するとします。

string connectionString =
    ConfigurationManager.ConnectionStrings["MyConnection"].ConnectionString;
var injectedConnectionString = new InjectionConstructor(connectionString);
container.RegisterType<MyDataContext>(injectedConnectionString);
于 2009-11-08T13:05:42.540 に答える
3

複数のコンストラクターから選択できるため、Unity はどれを使用すればよいかわかりません。すべてを満たすことができる最も多くの引数を持つものを選択しますが、この場合、それぞれ 2 つの解決可能な引数を持つ 2 つのコンストラクターがあります。

MyDataContextクラスを Unityに結合せず、Scott が提案した属性を使用したくない場合InjectionConstructor(賛成:))、流暢なインターフェースを使用して、登録時に使用する必要があるコンストラクターを指定できます。詳細については、コンストラクター、プロパティ、およびメソッド注入の構成を参照してください。

于 2009-11-08T14:15:58.030 に答える
1

MyDataContextコンストラクターが表示されません。ただし、使用する属性に[InjectionConstructor]属性を追加してみてください。

于 2009-11-08T13:51:11.113 に答える