更新:我想我已经从这个等式中消除了Unity。有关详细信息,请参阅下文。
更新2:我想我可能已经取消了实体框架。有关详细信息,请参阅下文。
我有一些代码正在构建一个统一容器,但它开始失败,上面的错误消息突然出现了。它适用于其他人的机器,但不适用于我的机器。我删除了解决方案所在的文件夹并刷新了源代码控制中的所有内容,以确保我没有任何可能导致问题的内容(例如,重复的程序集位于上一个版本中)。
以下是我的代码的一部分:
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()
时失败,我可以看到我放在该方法中的trace语句永远不会显示。
但是,如果我注释掉注册UserAccessEntities
类的行(这是从Entity Framework 5生成的代码),那么就构建了容器。当然,当我要求这种依赖时,它无法解决它,因此代码在其他地方失败了。
我已经用Google搜索了解决方案,他们似乎都解决了泛型并将泛型类型从方法转移到类级别。我不能这样做,因为EF5创建了类,它将泛型放在属性上。 e.g
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的方法,我给出了一个基本的实现方法:
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.
}