【发布时间】: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