如何在数据层或类中使用RavenDB查询?

时间:2014-07-15 21:47:43

标签: asp.net-mvc ravendb n-tier-architecture

我已经在我的MVC应用程序中嵌入了RavenDB。我跟随所有教程来制作RavenController,我可以查询控制器中的Session

现在我真的想摆脱控制器中的混合数据并创建一个数据层,以便我可以做一些业务逻辑,这将帮助我创建复杂的视图模型。

如何查询普通类文件中的Session?我似乎无法找到有关如何执行此操作的任何信息。

2 个答案:

答案 0 :(得分:2)

依赖注入对此非常有用。您不必创建必要的服务,让容器管理组件的生命周期,包括将IDocumentSession范围限定为每个HTTP请求一个实例。

例如,使用Autofac(您需要同时使用AutofacAutofac.Mvc5个套餐),您可以在App_Start文件夹中创建一个类,然后调用来自Global.asax的AutofacConfig.Configure()

public static class AutofacConfig
{
    public static IContainer Container { get; private set; }

    public static void Configure()
    {
        var builder = new ContainerBuilder();
        var thisAssembly = Assembly.GetExecutingAssembly();

        // Register our controllers with the container
        builder.RegisterControllers(thisAssembly).PropertiesAutowired(PropertyWiringOptions.PreserveSetValues);

        // Provide injections of the HTTP abstractions (HttpContextBase, etc.)
        builder.RegisterModule(new AutofacWebTypesModule());

        // Create and register the Raven IDocumentStore
        builder.Register(c =>
        {
            var store = new DocumentStore {ConnectionStringName = "RavenDB"};
            store.Initialize();

            Raven.Client.Indexes.IndexCreation.CreateIndexes(typeof (MvcApplication).Assembly, store);

            return store;
        })
            .As<IDocumentStore>()
            .SingleInstance();

        // Provide injection of Raven IDocumentSession
        builder.Register(c => c.Resolve<IDocumentStore>().OpenSession())
            .InstancePerRequest();

        Container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(Container));
    }
}

然后,当你需要在控制器之外的某个地方IDocumentSession时:

// Business logic, or other class that injection is not provided for.
var session = AutofacConfig.Container.Resolve<IDocumentSession>();

还包括autofac,否则您将收到错误消息&#34;不包含定义Resolve ...&#34;

using Autofac;

你可以和大多数其他DI容器库做类似的事情; API略有不同。

答案 1 :(得分:0)

HttpContext.Current.Session包含当前会话,但您绝对不应在业务逻辑层中使用它。业务逻辑层不应该知道HttpContext

此问题的基本解决方案是创建界面:

public interface ISession 
{
    int SomeValue { get; set; }
}

和实施

public class HttpContextBasedSession : ISession 
{
    public int SomeValue
    {
        get
        {
            return Convert.ToInt32(HttpContext.Current.Session["SomeValue"]);
        }

        set
        {
            HttpContext.Current.Session["SomeValue"] = value;
        }
    }
}

使用依赖注入框架绑定它。