![](/img/trans.png)
[英]Register multiple implementations of same interface in Castle Windsor
[英]Castle Windsor register an interface
我有一个名为'MyApp.DAL'的程序集,它包含和接口IRepository。 我还有另一个程序集“MyApp.Repository”,其中我有一些从IRepository派生的更复杂的存储库。
我还有服务层'MyApp.Service',其中一些服务引用来自'MyApp.Respository'的复杂存储库以及来自'MyApp.DAL'的简单接口IRepository。
这是界面:
public interface IRepository<T> where T : class
{
void Add(T entity);
void Update(T entity);
void Delete(T entity);
T GetById(long Id);
}
这是实施:
public abstract class Repository<T> : IRepository<T> where T : class
{
private MyContext dataContext;
private readonly IDbSet<T> dbset;
protected Repository(IDatabaseFactory databaseFactory)
{
DatabaseFactory = databaseFactory;
dbset = DataContext.Set<T>();
}
protected IDatabaseFactory DatabaseFactory
{
get;
private set;
}
protected MyContext DataContext
{
get { return dataContext ?? (dataContext = DatabaseFactory.Get()); }
}
public virtual void Add(T entity)
{
dbset.Add(entity);
}
public virtual void Update(T entity)
{
dbset.Attach(entity);
dataContext.Entry(entity).State = EntityState.Modified;
}
public virtual void Delete(T entity)
{
dbset.Remove(entity);
}
public virtual T GetById(long id)
{
return dbset.Find(id);
}
}
这是“服务”层中的服务:
public interface ICustomerService : IUpdateableService<Customer>
{
List<Customer> GetCustomers();
}
public class CustomerService : ICustomerService
{
private IUnitOfWork unitOfWork;
private IRepository<Customer> customerRepository;
public CustomerService(IUnitOfWork unitOfWork, IRepository<Customer> customerRepository)
{
this.unitOfWork = unitOfWork;
this.customerRepository = customerRepository;
}
public List<Customer> GetCustomers()
{
return customerRepository.GetAll().ToList();
}
public CustomerGet(int id)
{
return customerRepository.GetById(id);
}
public int Save(Customer customer)
{
//TODO
}
public bool Delete(Customer customer)
{
//TODO
}
我正在使用Castle Windsor注册以下类型:
container.Register(
Component.For(typeof(IRepository<>))
.ImplementedBy(typeof(IRepository<>))
.LifeStyle.PerWebRequest,
Classes.FromAssemblyNamed("MyApp.Repository")
.Where(type => type.Name.EndsWith("Repository"))
.WithServiceAllInterfaces()
.LifestylePerWebRequest());
但是,当我运行应用程序时,我收到以下错误:
类型MyApp.DAL.Interfaces.IRepository1 [[MyApp.Model.Customer,MyApp.Model,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]是抽象的。 因此,无法将其实例化为服务“MyApp.DAL.Interfaces.IRepository1”的实现。 你忘了代理吗?
我怎么解决这个问题?
ImplementedBy必须是具体的类,而不是接口/抽象类。
如果要注册IRepository<>
所有实现,可以编写:
container.Register(
Classes.FromAssemblyNamed("MyApp.Repository")
.BasedOn(typeof (IRepository<>))
.WithService.Base()
.LifestylePerWebRequest());
我看到Repository<T>
没有抽象成员。
如果您没有Repository<T>
任何派生类,那么它不应该是abstract
,IoC将能够为您创建Repository<Customer>
的实例。
container.Register(
Component.For(typeof(IRepository<>))
.ImplementedBy(typeof(Repository<>))
.LifestylePerWebRequest());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.