我有一个这样的安装程序:
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,因为我需要连接到多个数据库,并且我希望 Windsor 根据传递给存储库的类型参数解析适当的 DBcontext。
存储库类型参数受限于以下内容(GlobalObject 和 GlobalContext 指的是与 1 个此类数据库关联的类型):
public interface IGlobalObject : IObject
{}
public interface IObject
{
int Key { get; set; }
}
但是,温莎无法解决上下文,我无法弄清楚为什么?它已注册并在容器中,但无法解析。
编辑:
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());