更新: 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.
}