0

こんにちは、ここにあるコード例を変更しようとしています http://imar.spaanjaars.com/577/aspnet-n-layered-applications-implementing-a-repository-using-ef-code-first-part-5

彼の例では、構造マップを使用しています。それをウィンザーに変換すると、次を使用して 1 つのリポジトリで動作させることができます。

        container.Register(Component.For<IUnitOfWorkFactory>().ImplementedBy<EFUnitOfWorkFactory>(),
            Component.For<IUnitOfWork>().ImplementedBy<EFUnitOfWork>(),
            Component.For<Model.Repositories.IPeopleRepository>().ImplementedBy<PeopleRepository>().LifestyleTransient());

しかし、私が本当にやりたいことは、すべてのリポジトリベースのインターフェースをその実装にマップすることです。これが 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
{
}

このようなすべてのリポジトリを登録するために1つの登録をしたいのですが、一致せず、登録されていないサービス「Spaanjaars.ContactManager45.Model.Repositories.IPeopleRepository」というエラーが表示されます

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

これに関して何が欠けていますか?私のレポジトリには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 に答える