2

更新:我想我已经从等式中消除了 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.
}
4

0 回答 0