0

我有一个这样的安装程序:

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());
4

2 回答 2

0

这并不是您问题的直接答案。但我觉得这种方法可能是错误的。

考虑到您的存储库是由通用基础实现的,Repository<>我看不到将通用类型与正确上下文相关联的干净方式。我认为您可能需要切换到具有显式上下文注入的“风味”存储库和/或在注册上下文的方式上更加冗长。

于 2013-02-21T11:04:34.907 回答
0

这对我来说似乎是个问题:

//Contexts
container.Register(
    Component.For(typeof(Context<IGlobalObject>))
        .ImplementedBy(typeof(GlobalContext<>)).LifestyleTransient());

在这里你说 - 当有人要求 Context 注入 GlobalContext<> - 问题是温莎如何知道 GlobalContext 的通用参数是什么。

如果没有看到您的 GlobalContext 对象,很难看到它,但它应该是:

container.Register(
    Component.For(typeof(Context<>))
        .ImplementedBy(typeof(GlobalContext<>)).LifestyleTransient());
于 2013-02-21T08:22:30.153 回答