次のようなインストーラーがあります。
public void Install(IWindsorContainer container, IConfigurationStore store) {
//Services
container.Register(
Classes.FromAssemblyNamed(ASSEMBLY_NAME)
.BasedOn<IService>()
.WithServiceFirstInterface()
.LifestyleTransient());
//Repository
container.Register(
Component.For(typeof(IRepository<>))
.ImplementedBy(typeof(Repository<>))
.LifestyleTransient());
//Contexts
container.Register(
Component.For(typeof(Context<IGlobalObject>))
.ImplementedBy(typeof(GlobalContext<>)).LifestyleTransient());
}
リポジトリはオープン ジェネリックであり、Context コンストラクターが注入されています。これは EF DbContext のラッパーですが、接続する必要があるデータベースを示す型引数を取ります。複数のデータベースに接続する必要があるため、複数の DbContext があり、リポジトリに渡された型引数に基づいてウィンザーに適切な DBcontext を解決させたいという考えです。
リポジトリ タイプの引数は、次のように制限されます (GlobalObject および GlobalContext は、そのようなデータベースに関連付けられたタイプを参照します)。
public interface IGlobalObject : IObject
{}
public interface IObject
{
int Key { get; set; }
}
しかし、Windsor はコンテキストを解決できず、その理由がわかりません。コンテナに登録されていますが、解決できません。
編集:
GlobalContext のコード:
public class GlobalContext<T> : Context<T>
where T : IGlobalObject
{
private const string GLOBAL_CSTR = "Global";
public GlobalContext() : base(ConfigurationManager.ConnectionStrings[GLOBAL_CSTR].ConnectionString) {}
public DbSet<Company> Companies { get; set; }
public DbSet<ConnectionString> ConnectionStrings { get; set; }
public DbSet<Server> Servers { get; set; }
}
環境:
//Wrapper around dbcontext which enforces type
public abstract class Context<T> : DbContext where T : IObject
{
protected Context() {}
protected Context(string connectionString) : base(connectionString){}
}
編集2:
すべてのシナリオで具体的なタイプを指定すると、それが機能するため、明らかにインターフェースでのマッチングと関係があります。
//Contexts
container.Register(
Component.For(typeof(Context<Server>))
.ImplementedBy(typeof(GlobalContext<Server>)).LifestyleTransient());