【问题标题】:Castle windsor wire generic irepository with 2 typesCastle Windsor Wire 通用存储库,有 2 种类型
【发布时间】:2013-11-20 12:05:16
【问题描述】:

您好,我正在尝试更改此处找到的代码示例 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 个泛型类型吗?

【问题讨论】:

    标签: asp.net-mvc-4 c#-4.0 entity-framework-5 castle-windsor irepository


    【解决方案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());
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      相关资源
      最近更新 更多