私は3つのプロジェクトを持っています
- アプリケーション.インフラストラクチャ
- Application.A ( からの参照があります
Application.Infrastructure
) - Application.B ( からの参照があります
Application.Infrastructure
) - Application.Web (すべてからの参照があります)
私にはApplication.Infrastructure
汎用リポジトリクラスがあります
public interface IRepository<T>
{
T FirstOrDefault(Expression<Func<T, bool>> where);
}
私はこのApplication.A
リポジトリの実装を持っています
public class ApplicationARepository<T> : IRepository<T>
{
private readonly IApplicationADBContext _context;
public ApplicationARepository(IApplicationADBContext context)
{
_context = context;
}
// implementation
}
私にApplication.B
は、リポジトリインターフェースの別の実装があります
public class ApplicationBRepository<T> : IRepository<T>
{
private readonly IApplicationBDBContext _context;
public ApplicationBRepository(IApplicationBDBContext context)
{
_context = context;
}
// implementation
}
Application.Web では、Ninject を使用してインターフェイスをバインドします
// Bind implementations from Application.A
kernel.Bind<IApplicationADBContext>().To<ApplicationADBContext>().InRequestScope();
kernel.Bind(typeof(IRepository<>)).To(typeof(ApplicationARepository<>));
// Bind implementations from Application.B
kernel.Bind<IApplicationBDBContext>().To<ApplicationBDBContext>().InRequestScope();
// Here should fail. I already binded typeof(IRepository<>) to typeof(ApplicationARepository<>)
kernel.Bind(typeof(IRepository<>)).To(typeof(ApplicationBRepository<>));
.Where() 句を指定せずに、同じインターフェイスを 2 つの異なる型にバインドしても、動作しており、エラーは発生しません。
なんで?Ninject はどのようにそれらを区別する方法を知っているのでしょうか?