更新:我想我已经从等式中消除了 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()
,我可以看到我放在该方法中的跟踪语句永远不会显示。
但是,如果我注释掉注册的行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,我都给出了一个基本的实现:
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.
}