2

更新: Unity を方程式から除外したと思います。詳細については、以下を参照してください。

更新 2: 方程式から Entity Framework を除外した可能性があると思います。詳細については、以下を参照してください。

Unity コンテナーをビルドしているコードがいくつかありますが、上記のエラー メッセージが突然表示されて失敗し始めました。他の人のマシンでは動作しますが、私のマシンでは動作しません。ソリューションが含まれていたフォルダーを削除し、ソース管理からすべてを更新して、問題を引き起こす可能性のあるものがないことを確認しました (たとえば、以前のビルドから重複したアセンブリが横たわっています)。

ここに私のコードの一部があります:

public static class UnityBootstrapper
{
    public static IUnityContainer Initialise()
    {
        Trace.WriteLine("UnityBootstrapper.Initialise()");
        var container = BuildUnityContainer();

        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
        return container;
    }

    private static IUnityContainer BuildUnityContainer()
    {
        Trace.WriteLine("UnityBootstrapper.BuildUnityContainer()");
        var container = new UnityContainer();

        // Other dependencies are registered here

        // If the following line is commented out the container is build
        // but, obviously, it won't resolve this dependency.
        container.RegisterType<IUserAccessEntities, UserAccessEntities>(WebRequestLifetime);

        // Other dependencies are registered here

        return container;
    }

コードは の呼び出しで明らかに失敗し、BuildUnityContainer()そのメソッド内に置いたトレース ステートメントが表示されないことがわかります。

ただし、UserAccessEntitiesクラスを登録する行 (Entity Framework 5 から生成されたコード) をコメント アウトすると、コンテナーがビルドされます。当然、その依存関係を要求しても解決できないため、コードは別の場所で失敗します。

私は解決策をグーグルで検索しましたが、それらはすべてジェネリックを解決し、ジェネリック型をメソッドからクラスレベルに移動するようです。EF5 がクラスを作成し、ジェネリックをプロパティに配置するため、それはできません。例えば

 DbSet<MyTable> Tables { get; set; }

私が考えることができる唯一の他のことは、呼び出されたEF5生成クラスからインターフェイスを抽出したことでIUserAccessEntitiesあり、問​​題はそこにある可能性があります...しかし、ReSharperを使用してそれを生成したので、完全に整列する必要があります.

アップデート

Unity を方程式から除外するためUserAccessEntitiesに、独自に新しいものを作成しようとしました

    private static void TestUae()
    {
        var uae = new UserAccessEntities(); //container.Resolve<IUserAccessEntities>();
        Trace.WriteLine("Got the entities: " + uae);
    }

代わりにへの呼び出しがTestUae()失敗します。

更新 2

AlternativeEntities以前に抽出したインターフェースに基づいて、新しいクラスを作成しました。それを直接構築しようとすると、新しい例外があります:Method 'Set' in type 'AlternativeEntities' from assembly 'UserAccess.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' does not have an implementation.

しかし、そうです。set と呼ばれる 2 つのメソッドがあり、どちらも基本的な実装を示しています。

public class AlternativeEntities : IUserAccessEntities
{
    public DbSet<TEntity> Set<TEntity>() where TEntity : class
    {
        Trace.WriteLine("public DbSet<TEntity> Set<TEntity>() where TEntity : class");
        return null;
    }

    public DbSet Set(Type entityType)
    {
        Trace.WriteLine("public DbSet Set(Type entityType)");
        return null;
    }
// Other methods and properties here.
}
4

0 に答える 0