0

私はこのような2つのクラスを持っています:

1)

public class EFInitializerLanguage : EFInitializerBase, IRepositoryInitializer<Language>
{
    public IEntityRepository<Language> Create()
    {
        return this.Model.CreateObjectContext<LanguageData>(new SqlConnection(Utility.ConnectionStrings.ConnDefault));
    }
}

2)

public class EFInitializerPerson : EFInitializerBase, IRepositoryInitializer<Person>
    {
        public IEntityRepository<Person> Create()
        {
            return this.Model.CreateObjectContext<PersonData>(new SqlConnection(Utility.ConnectionStrings.ConnDefault));
        }
    }

そして、Unity.config の定義は (おそらくこれらは間違っていて、何をすべきかわかりませんでした)

<unity>
    <typeAliases>
<typeAlias alias="IRepositoryInitializer`1" type="Contracts.Repositories.IRepositoryInitializer`1, Contracts" />
        <typeAlias alias="EFInitializerPerson" type="Data.Initializers.EFInitializerPerson, Data" />

    <typeAlias alias="IRepositoryInitializerLanguage`1" type="Contracts.Repositories.IRepositoryInitializer`1, Contracts" />
    <typeAlias alias="EFInitializerLanguage" type="Data.Initializers.EFInitializerLanguage, Data" />
<containers>
        <container>
            <types>
<type type="IRepositoryInitializer`1" mapTo="EFInitializerPerson" />
        <type type="IRepositoryInitializerLanguage`1" mapTo="EFInitializerLanguage" />
</types>
        </container>
    </containers>
</unity>

2つ以上ではなく1つのEFInitializerを使用することを考えるかもしれませんが、入力と出力のタイプが異なるため、作成できませんでした。この時点で、私の現在のアプローチは私には問題ないように思えます。

実行時に発生するエラーは次のとおりです。

依存関係の解決に失敗しました。タイプ = "Contracts.DataManagers.ILanguageManager"、名前 = ""。例外メッセージ: 現在のビルド操作 (ビルド キー Build Key[Contracts.DataManagers.ILanguageManager, null]) が失敗しました: 現在の型、Contracts.DataManagers.ILanguageManager はインターフェイスであり、構築できません。タイプマッピングがありませんか? (戦略タイプ BuildPlanStrategy、インデックス 3)

構成ファイルでは、同じインターフェイスを実装する2つの異なるクラスがある場合、宣言は異なる必要があるようです。

正しい方向に向けていただければ幸いです。

前もって感謝します、

4

1 に答える 1

0

これが私の問題の正確な解決策であるとは言えません。しかし、回避策を考えました。2 つの EFInitializer を使用する代わりに、以下のようにジェネリック型の 1 つにマージしました。

public class EFInitializer<T, TP>: EFInitializerBase, IRepositoryInitializer<T> 
        where T : class
        where TP : ObjectContext, IEntityRepository<T>
    {
        public IEntityRepository<T> Create()
        {
            return this.Model.CreateObjectContext<TP>(new SqlConnection(Utility.ConnectionStrings.ConnDefault));
        }
    }

ユニティ構成は次のようになりました。

<unity>
    <typeAliases>
<typeAlias alias="IRepositoryInitializer`1" type="Contracts.Repositories.IRepositoryInitializer`1, Contracts" />
        <typeAlias alias="EFInitializer`2" type="Data.Initializers.EFInitializer`2, Data" />
</typeAliases>
    <containers>
        <container>
            <types>
<type type="IRepositoryInitializer`1" mapTo="EFInitializer`2" />
</types>
        </container>
    </containers>
</unity>

まあ、このアプローチでは、少なくともエンティティごとに EFInitializer を記述する必要はありません。これは私にとって非常にクールです。

その結果、この解決策は私の問題と完全に一致しません。私はまだシステム設計に取り組んでいるので、おそらく同じ問題に遭遇するでしょう。

ご協力ありがとうございました。

于 2012-08-27T18:53:49.897 に答える