1

我围绕一个可行的解决方案扭转自己,将 RavenDB 中的多个数据库用于使用 Castle Windsor 进行布线的 ASP.Net MVC 应用程序。

这是当前的安装程序

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

}

以上工作完美,但仅适用于一个 Database

我找不到正确的想法如何处理另一个数据库。整个链从请求IDocumentSession的域服务开始。然后流程如上述安装程序中指定。但是我在哪里/如何要求“SessionToDb1”或“SessionToDb2”?

当然,重要的是要使用什么连接字符串(指定 DB 属性的位置),还有要在各自的 DB/DocumentStore 中创建什么索引。

有人用温莎做到这一点吗?我在这里想/攻击错了吗?

谢谢!

4

2 回答 2

1

因为你有:

Component.For<IDocumentSession>()
         .UsingFactoryMethod(GetDocumentSesssion)
         .LifeStyle.PerWebRequest

每当您GetDocumentSession注入IDocumentSession. 这很好。

使用多个数据库时,您需要将数据库名称作为参数传递给OpenSession. 因此,您需要一些方法来根据当前的 Web 请求来解析要连接的数据库。

您需要修改该GetDocumentSession方法以实现您要使用的任何自定义逻辑。例如,您可能想要查看 cookie、asp.net 会话项、当前线程主体或其他一些标准。该决定是您的应用程序自定义的,重要的是您以正确的数据库名称打开会话。

于 2013-06-03T18:25:56.433 回答
0

我之前在使用 nhibernate 时遇到过这个问题。

我发现最好的解决方案是创建一个 SessionManager 类,它包装了文档存储的创建和 Session..

所以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 回答