您好我正在尝试更改此处找到的代码示例 http://imar.spaanjaars.com/577/aspnet-n-layered-applications-implementing-a-repository-using-ef-code-first-part-5
在他的例子中,他使用结构图,当我将其转换为windsor时,我可以使用以下内容将其与一个存储库一起使用。
container.Register(Component.For<IUnitOfWorkFactory>().ImplementedBy<EFUnitOfWorkFactory>(),
Component.For<IUnitOfWork>().ImplementedBy<EFUnitOfWork>(),
Component.For<Model.Repositories.IPeopleRepository>().ImplementedBy<PeopleRepository>().LifestyleTransient());
但我真正想做的是将所有基于irepository的接口映射到它们的实现。 这是IRepository,T是实体,K是prmiary密钥类型
public interface IRepository<T, K> where T : class
{
}
它的实现是
public abstract class Repository<T> : IRepository<T, int>, IDisposable where T : DomainEntity<int>
{
}
我的控制器将接口IPeopleRepository作为构造函数参数。
public interface IPeopleRepository : IRepository<Person, int>
{
}
public class PeopleRepository : Repository<Person>, IPeopleRepository
{
}
我希望有一个注册表来注册所有存储库,类似这样,但它不匹配,我得到错误服务'Spaanjaars.ContactManager45.Model.Repositories.IPeopleRepository'未注册
container.Register(Component.For(typeof(IRepository<,>))
.ImplementedBy(typeof(Repository<>))
.LifestylePerWebRequest());
我对此缺少什么?是因为我的irepository有2种泛型?
答案 0 :(得分:1)
为了将所有基于IRepository的接口映射到它们的实现,应该使用 .WithService.AllInterfaces()。
此注册应解决您的问题。
container.Register(
Classes.FromThisAssembly()
.BasedOn(typeof(IRepository<,>))
.WithService.AllInterfaces()
.LifestylePerWebRequest());
有一些测试可以测试它。我声称它们是绿色的。
[TestClass]
public class InstallerTest
{
private IWindsorContainer container;
[TestInitialize]
public void Init()
{
container = new WindsorContainer().Install(new Installer());
}
[TestMethod]
public void ResilveTest_ResolvesViaIRepository()
{
// act
var repository = container.Resolve<IRepository<Person, int>>();
// assert
repository.Should().BeOfType<PeopleRepository>();
}
[TestMethod]
public void ResilveTest_ResolvesViaIPeopleRepository()
{
// act
var repository = container.Resolve<IPeopleRepository>();
// assert
repository.Should().BeOfType<PeopleRepository>();
}
}
public class Installer : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(
Classes.FromThisAssembly()
.BasedOn(typeof(IRepository<,>))
.WithService.AllInterfaces()
.LifestylePerThread());
}
}