【问题标题】:Microsoft unity cannot resolve generic typeMicrosoft unity 无法解析泛型类型
【发布时间】:2015-08-05 09:48:39
【问题描述】:

我在使用 Microsoft Unity 时遇到了问题,与这篇文章 here 中的非常相似,但没有一个答案对我有用。 我有解决方案,它由几个项目组成。在第一个重要项目 Bootstrap 中,我将 UnityContainer 定义如下:

public static class Bootstrap
{
    private static readonly IUnityContainer _unityContainer;

    static Bootstrap()
    {
        _unityContainer = new UnityContainer();
        _unityContainer.RegisterType(typeof (IRepository<>), typeof (Ef6Repository<>));
        _unityContainer.RegisterType<IUnitOfWork, Ef6UnitOfWork>();
    }

    public static IUnityContainer GetConfiguredContainer()
    {
        return _unityContainer;
    }
}

问题在线 _unityContainer.RegisterType(typeof (IRepository), typeof (Ef6Repository));,其中 Unity 表示无法解析方法“RegisterType(System.Type, System.Type)”。但正如MSDN 中所述,这条线是正确的。几天前它可以编译和工作。我认为这个问题可能出在我使用 Ef6UnitOfWork 或 Ef6Repository 的某个地方。

有人可以帮忙吗?我无法弄清楚我做错了什么。 Unity 的版本是 3.5

下面是我在解决方案中的第二个项目“存储库”中的代码。

public interface IRepository<T>
{
    T GetById(Guid id);
    IQueryable<T> GetAll();
    IEnumerable<T> Find(Expression<Func<T, bool>> predicate);
    ApplicationUserManager GetUserManager();
    ApplicationRoleManager GetRoleManager();
}

public class Ef6Repository<T> : IRepository<T> where T : class
{
    public DbContext context;
    public DbSet<T> dbset;
    private readonly ApplicationUserManager _userManager;
    private readonly ApplicationRoleManager _roleManager;

    public Ef6Repository(DbContext context)
    {
        this.context = context;
        dbset = context.Set<T>();
    }

    public Ef6Repository(DbContext context, ApplicationUserManager userManager)
    {
        this.context = context;
        dbset = context.Set<T>();
        _userManager = userManager;
    }

    public Ef6Repository(DbContext context, ApplicationRoleManager roleManager)
    {
        this.context = context;
        dbset = context.Set<T>();
        _roleManager = roleManager;
    }

    public T GetById(Guid id)
    {
        return dbset.Find(id);
    }


    public IQueryable<T> GetAll()
    {
        return dbset;
    }

    public IEnumerable<T> Find(Expression<Func<T, bool>> predicate)
    {
        return dbset.Where(predicate);
    }

    public ApplicationUserManager GetUserManager()
    {
        return _userManager;
    }

    public ApplicationRoleManager GetRoleManager()
    {
        return _roleManager;
    }
}

public interface IUnitOfWork : IDisposable
{
    IRepository<Person> PersonRepository { get; }
    IRepository<ApplicationUser> ApplicationUserRepository { get; }
    IRepository<IdentityRole> ApplicationRoleRepository { get; }
    void Save();
}

public partial class Ef6UnitOfWork : IUnitOfWork
{
    private IRepository<Person> _personRepository;
    private IRepository<ApplicationUser> _applicationUserRepository;
    private IRepository<IdentityRole> _applicationRoleRepository;
    private Context _context;

    public Ef6UnitOfWork()
    {
        _context = new Context();
    }

    public IRepository<Person> PersonRepository
    {
        get
        {
            if (_personRepository == null)
                _personRepository = new Ef6Repository<Person>(_context);
            return _personRepository;
        }
    }

    public IRepository<ApplicationUser> ApplicationUserRepository
    {
        get
        {
            if (_applicationUserRepository == null)
                _applicationUserRepository = new Ef6Repository<ApplicationUser>(_context,
                        new ApplicationUserManager(new UserStore<ApplicationUser>(_context))
                    );
            return _applicationUserRepository;
        }
    }

    public IRepository<IdentityRole> ApplicationRoleRepository
    {
        get
        {
            if (_applicationRoleRepository == null)
                _applicationRoleRepository = new Ef6Repository<IdentityRole>(_context,
                        new ApplicationRoleManager(new RoleStore<IdentityRole>(_context))
                    );
            return _applicationRoleRepository;
        }
    }

    public void Save()
    {
        _context.SaveChanges();
    }

    #region IDisposable
    private bool disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                _context.Dispose();
            }
        }
        this.disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
    #endregion
}

【问题讨论】:

  • 您的 Unity 代码看起来不错。听起来你有一个编译错误。其他发布的代码 sn-p 无法编译,因为您没有包含所有依赖类。虽然,您应该将示例修剪到重新创建问题所需的最低限度,而不是包含更多代码(这样做可能会导致您遇到问题)。此外,如果您使用 Unity(或其他 DI 容器),我不确定 Ef6UnitOfWork 为何要更新存储库;这正是容器用来注入的依赖类型。
  • 是的,这是一个编译错误。经过一番谷歌搜索后,我认为问题出在 Ef6Repository 构造函数中。编译器在构造函数 public Ef6Repository(DbContext context) 和 public Ef6Repository(DbContext context, ApplicationUser/RoleManager user/roleManager) 上有问题。但即使我删除了这个构造函数,问题并没有消失:-(
  • @user3899265,你能发布确切的编译器错误消息吗?
  • @user3899265,另外,请发布您的using 条款。我怀疑问题就在那里。 IUnityContainer 只有一个 RegisterType 方法,并不是你通常想要的。所有其他重载都是扩展方法。
  • @Thomas Levesque - 现在我取消注释该死的代码行,VS 仍然告诉我有一个错误(行有下划线),但项目是可构建的并且没有出现编译错误。所以我不知道。但是当我在下划线线上移动鼠标时,我看到了:无法解析方法RegisterType(System.Type,System.Type),候选者是:

标签: generics repository unity-container unit-of-work


【解决方案1】:

如果项目构建没有错误,那么问题不在您的代码中。看起来 ReSharper 有时会感到困惑,并开始显示不存在的错误。只需清除 R# 解决方案缓存,一切都会恢复正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    相关资源
    最近更新 更多