0

嗨,我正在尝试更改此处找到的代码示例 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是主键类型

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
{
}

我想要一个注册器来注册所有存储库,类似这样,但它不匹配,我收到错误 Service 'Spaanjaars.ContactManager45.Model.Repositories.IPeopleRepository' 未注册

container.Register(Component.For(typeof(IRepository<,>))
                             .ImplementedBy(typeof(Repository<>))
                             .LifestylePerWebRequest());

我在这方面缺少什么?是因为我的 irepository 有 2 个泛型类型吗?

4

1 回答 1

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());
    }
}
于 2013-11-20T19:25:06.947 回答