【发布时间】:2015-10-14 05:53:24
【问题描述】:
我使用 asp.net 5 创建了一个仅限 Web api 的项目,并尝试设置我的 NHibernate 会话管理。一切似乎都很好,但是当我尝试使用会话时,在我的控制器内部,我得到一个空异常,尽管我用NHibernateSession 属性标记它。
我意识到该方法不使用该属性创建的会话。我应该怎么做才能让它使用那个?非常感谢任何建议。
public class ValuesController : Controller
{
private readonly IRepository _repository;
public ISessionContainer NHibernateSession { get; set; }
public ValuesController(IRepository repository)
{
_repository = repository;
}
// GET: api/values
[HttpGet, NHibernateSession]
public IEnumerable<string> Get()
{
return _repository.GetProducts(); // session is null exception
}
}
public class NHibernateSessionAttribute: ActionFilterAttribute
{
protected ISessionContainer sessionContainer;
public NHibernateSessionAttribute()
{
sessionContainer = new NHibernateSessionContainer();
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
sessionContainer.OpenSession();
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
sessionContainer.CloseSession();
}
}
public class NHibernateSessionContainer : ISessionContainer
{
public static ISessionFactory SessionFactory = CreateSessionFactory();
private ISession _session;
private static ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()
.Database(OracleClientConfiguration.Oracle10
.ConnectionString(ConfigurationManager.ConnectionStrings["Main.ConnectionString"].ConnectionString))
.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()))
.BuildConfiguration().BuildSessionFactory();
}
public ISession Session
{
get { return _session; }
}
public void OpenSession()
{
_session = SessionFactory.OpenSession();
}
public void CloseSession()
{
Dispose();
}
public void Dispose()
{
_session.Dispose();
}
}
services.AddSingleton<ISessionContainer, NHibernateSessionContainer>();
services.AddTransient<IRepository, Repository>();
【问题讨论】:
标签: c# nhibernate dependency-injection asp.net-web-api2 asp.net-core