Unity - 当前类型是接口,无法构造。通用存储库 DI
Unity - The current type is an interface and cannot be constructed. Generic repository DI
我有通用存储库:
public interface IRepository<T> where T : class
{
void Add(T entity);
void Update(T entity);
void Delete(T entity);
void Delete(Expression<Func<T, bool>> where);
T GetById(long id);
T GetById(string id);
T Get(Expression<Func<T, bool>> where);
IEnumerable<T> GetAll();
IEnumerable<T> GetMany(Expression<Func<T, bool>> where);
}
并实现了class:
public abstract class BaseRepository<T> where T : class
{
private ApplicationDbContext _context;
private readonly IDbSet<T> dbset;
protected BaseRepository(IDatabaseFactory databaseFactory)
{
DatabaseFactory = databaseFactory;
dbset = _context.Set<T>();
}
protected IDatabaseFactory DatabaseFactory
{
get;
private set;
}
protected ApplicationDbContext DataContext
{
get { return _context ?? (_context = DatabaseFactory.Get()); }
}
//methods below..
}
我有 UserRepository 接口:
public interface IUserRepository : IRepository<UserRepository>
{
}
public class UserRepository : BaseRepository<UserRepository>, IUserRepository
{
public UserRepository(IDatabaseFactory databaseFactory) : base(databaseFactory)
{
}
}
我正在使用 BaseController 在从 Base 扩展的任何控制器中获取我的身份 currentUser:
基础控制器:
public class BaseController : Controller
{
protected readonly IUserRepository userRepository;
public UserAccountModel currentUser { get; private set; }
public BaseController(IUserRepository UserRepository)
{
this.userRepository = UserRepository;
}
//Initialize
}
和家庭控制器:
public class HomeController : BaseController
{
protected readonly IUserRepository userRepository;
public HomeController(IUserRepository UserRepository) : base(UserRepository)
{
this.userRepository = UserRepository;
}
//actions
}
我正在使用 Unity IoC,我的 UnityConfig.cs 看起来像这样:
private static void RegisterTypes(IUnityContainer container)
{
container.RegisterType<IUnitOfWork, UnitOfWork>();
container.RegisterType<IDatabaseFactory, DatabaseFactory>();
container.RegisterType<ApplicationDbContext>();
container.RegisterType<ApplicationSignInManager>();
container.RegisterType<ApplicationUserManager>();
container.RegisterType<IAuthenticationManager>(
new InjectionFactory(c => HttpContext.Current.GetOwinContext().Authentication));
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(
new InjectionConstructor(typeof(ApplicationDbContext)));
container.RegisterType(typeof(IRepository<>), typeof(BaseRepository<UserRepository>));
}
在 运行,我收到错误:
The current type, ProjectName.Data.Repository.IUserRepository, is an interface and cannot be constructed. Are you missing a type mapping?
我认为我的问题是错误的类型注册,但我已经为此崩溃了...
在我看来,您需要 IUserRepository
和 UserRepository
之间的映射。
例如:
container.RegisterType<IUserRepository, UserRepository>();
IUserRepository
是 HomeController
所需要的,所以它应该在 Ioc 中注册。在 HomeController
的解析过程中,Ioc 将尝试解析 Ioc 中不存在的 IUserRepository
。尝试改变:
container.RegisterType(typeof(IRepository<>), typeof(BaseRepository<UserRepository>));
至:
container.RegisterType<IUserRepository, UserRepository>()
我有通用存储库:
public interface IRepository<T> where T : class
{
void Add(T entity);
void Update(T entity);
void Delete(T entity);
void Delete(Expression<Func<T, bool>> where);
T GetById(long id);
T GetById(string id);
T Get(Expression<Func<T, bool>> where);
IEnumerable<T> GetAll();
IEnumerable<T> GetMany(Expression<Func<T, bool>> where);
}
并实现了class:
public abstract class BaseRepository<T> where T : class
{
private ApplicationDbContext _context;
private readonly IDbSet<T> dbset;
protected BaseRepository(IDatabaseFactory databaseFactory)
{
DatabaseFactory = databaseFactory;
dbset = _context.Set<T>();
}
protected IDatabaseFactory DatabaseFactory
{
get;
private set;
}
protected ApplicationDbContext DataContext
{
get { return _context ?? (_context = DatabaseFactory.Get()); }
}
//methods below..
}
我有 UserRepository 接口:
public interface IUserRepository : IRepository<UserRepository>
{
}
public class UserRepository : BaseRepository<UserRepository>, IUserRepository
{
public UserRepository(IDatabaseFactory databaseFactory) : base(databaseFactory)
{
}
}
我正在使用 BaseController 在从 Base 扩展的任何控制器中获取我的身份 currentUser:
基础控制器:
public class BaseController : Controller
{
protected readonly IUserRepository userRepository;
public UserAccountModel currentUser { get; private set; }
public BaseController(IUserRepository UserRepository)
{
this.userRepository = UserRepository;
}
//Initialize
}
和家庭控制器:
public class HomeController : BaseController
{
protected readonly IUserRepository userRepository;
public HomeController(IUserRepository UserRepository) : base(UserRepository)
{
this.userRepository = UserRepository;
}
//actions
}
我正在使用 Unity IoC,我的 UnityConfig.cs 看起来像这样:
private static void RegisterTypes(IUnityContainer container)
{
container.RegisterType<IUnitOfWork, UnitOfWork>();
container.RegisterType<IDatabaseFactory, DatabaseFactory>();
container.RegisterType<ApplicationDbContext>();
container.RegisterType<ApplicationSignInManager>();
container.RegisterType<ApplicationUserManager>();
container.RegisterType<IAuthenticationManager>(
new InjectionFactory(c => HttpContext.Current.GetOwinContext().Authentication));
container.RegisterType<IUserStore<ApplicationUser>, UserStore<ApplicationUser>>(
new InjectionConstructor(typeof(ApplicationDbContext)));
container.RegisterType(typeof(IRepository<>), typeof(BaseRepository<UserRepository>));
}
在 运行,我收到错误:
The current type, ProjectName.Data.Repository.IUserRepository, is an interface and cannot be constructed. Are you missing a type mapping?
我认为我的问题是错误的类型注册,但我已经为此崩溃了...
在我看来,您需要 IUserRepository
和 UserRepository
之间的映射。
例如:
container.RegisterType<IUserRepository, UserRepository>();
IUserRepository
是 HomeController
所需要的,所以它应该在 Ioc 中注册。在 HomeController
的解析过程中,Ioc 将尝试解析 Ioc 中不存在的 IUserRepository
。尝试改变:
container.RegisterType(typeof(IRepository<>), typeof(BaseRepository<UserRepository>));
至:
container.RegisterType<IUserRepository, UserRepository>()