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 があり、リポジトリに渡された型引数に基づいてウィンザーに適切な 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());
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 inject a GlobalContext<> を要求したとき - 問題は、Windsor が GlobalContext の一般的な引数が何であるかを知ることを意図していることです。

GlobalContext オブジェクトを見ずに見るのは難しいですが、次のようにする必要があります。

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