1

配線にCastle Windsorを使用するASP.Net MVCアプリに、RavenDBの複数のデータベースを使用する実行可能なソリューションをひねります。

これが現在のインストーラーです

public class RavenInstaller : IWindsorInstaller
{

    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(
            Component.For<IDocumentStore>().Instance(CreateDocumentStore()).LifeStyle.Singleton,
            Component.For<IDocumentSession>().UsingFactoryMethod(GetDocumentSesssion).LifeStyle.PerWebRequest
            );
    }

    static IDocumentStore CreateDocumentStore()
    {
        var store = new DocumentStore { ConnectionStringName = "RavenDb_CS9" };
        store.Initialize();
        IndexCreation.CreateIndexes(typeof(Users).Assembly, store);
        return store;
    }

    static IDocumentSession GetDocumentSesssion(IKernel kernel)
    {
        var store = kernel.Resolve<IDocumentStore>();
        return store.OpenSession();
    }

}

上記は完璧に機能しますが、1 つの Database に対してのみです

別のデータベースを処理する適切な考え方が見つかりません。チェーン全体は、 IDocumentSessionを要求するドメイン サービスから始まります。その後、フローは上記のインストーラーで指定されたとおりです。しかし、「SessionToDb1」または「SessionToDb2」をどこで/どのように要求すればよいですか?

重要なのはもちろん、使用する接続文字列 (DB プロパティが指定されている場所) だけでなく、それぞれの DB / DocumentStore で作成するインデックスも重要です。

ウィンザーを使用してこれを達成した人はいますか? ここで間違って考えたり攻撃したりしていますか?

ありがとう!

4

2 に答える 2

0

以前に nhibernate でこの問題に遭遇しました。

最良の解決策は、ドキュメント ストアの作成とセッションをラップする SessionManager クラスを作成することであることがわかりました。

そうIE

public interface ISessionManager
{
    void BuildDocumentStore();
    IDocumentSession OpenSession();
}

public interface ISiteSessionManager : ISessionManager
{

}

public class SiteSessionManager : ISiteSessionManager
{
    IDocumentStore _documentStore;

    public SiteSessionManager()
    {
        BuildDocumentStore();
    }

    public void BuildDocumentStore()
    {
        _documentStore = new DocumentStore
        {
            Url = "http://localhost:88",
            DefaultDatabase = "test"
        };

        _documentStore.Initialize();
        IndexCreation.CreateIndexes(typeof(SiteSessionManager).Assembly, _documentStore);
    }

    public IDocumentSession OpenSession()
    {
        return _documentStore.OpenSession();
    }
}

// And then!. 
Container.Register(Component.For<ISiteSessionManager>().Instance(new SiteSessionManager()).LifestyleSingleton());

// And then!.
public class FindUsers
{
    readonly ISiteSessionManager _siteSessionManager;

    public FindUsers(ISiteSessionManager siteSessionManager)
    {
        _siteSessionManager = siteSessionManager;
    }

    public IList<User> GetUsers()
    {
        using (var session = _siteSessionManager.OpenSession())
        {
            // do your query
            return null;
        }
    }
}

複数のデータベースに対してすすぎ、繰り返します。

于 2014-02-17T22:34:31.720 に答える