我已经在我的MVC应用程序中嵌入了RavenDB。我跟随所有教程来制作RavenController
,我可以查询控制器中的Session
。
现在我真的想摆脱控制器中的混合数据并创建一个数据层,以便我可以做一些业务逻辑,这将帮助我创建复杂的视图模型。
如何查询普通类文件中的Session
?我似乎无法找到有关如何执行此操作的任何信息。
答案 0 :(得分:2)
依赖注入对此非常有用。您不必创建必要的服务,让容器管理组件的生命周期,包括将IDocumentSession范围限定为每个HTTP请求一个实例。
例如,使用Autofac(您需要同时使用Autofac和Autofac.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;
}
}
}
使用依赖注入框架绑定它。