我正在使用简单的注射器和流利的Nhibernate。我使用以下代码在SimpleInjectorInitializer文件中记录了“Session”:
var container = Bootstrapper.
container.Register(() => Core.Core.Dados.NH.NhSessionFactory.Current.OpenSession(),
new SimpleInjector.Integration.Web.WebRequestLifestyle());
但是,会话是通过我的“UnitOfWork”中的构建器,她已注册,总是有一个“Session”活动实例,在处理对象时导致一些错误,因为“具有相同标识符的不同对象价值已与会议相关联“。 如何使用Nhiberante UnitOfWork处理“Session”以避免此问题?
答案 0 :(得分:1)
我在寻找使用Simple Injector和Fluent nhibernate(从Ninject切换到Simple Injector时)的解决方案时遇到了这个问题。此示例不使用工作单元模式,因为实际上nHibernate的会话 是 工作单元容器。这就是它的完成方式(ASP.NET MVC exmple)
SessionProvider
public class SessionProvider
{
private readonly string _connectionString;
private ISessionFactory _sessionFactory;
public ISessionFactory SessionFactory
{
get { return _sessionFactory ?? (_sessionFactory = CreateSessionFactory()); }
}
public SessionProvider(string connectionString)
{
_connectionString = connectionString;
}
private ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()
.Database(SQLiteConfiguration.Standard.ConnectionString(_connectionString)
.Driver<ProfiledSQLiteClientDriver>)
.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()))
.ExposeConfiguration(cfg => cfg.Properties.Add("use_proxy_validator", "false"))
.BuildSessionFactory();
}
}
的Global.asax.cs
var sessionProvider = new SessionProvider(ConfigurationManager.ConnectionStrings["sqlite"].ConnectionString);
var container = new SimpleInjector.Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
container.Register(typeof(IRepository<>), new[] { typeof(Repository<>).Assembly });
container.RegisterSingleton<ICommandDispatcher>(new CommandDispatcher(container));
container.Register(typeof(ICommandHandler<>), new[] { typeof(UserCommandsHandler).Assembly });
/* here comes Session wiring ....*/
container.Register(() => sessionProvider.SessionFactory, Lifestyle.Singleton);
container.Register<ISession>(()=> container.GetInstance<ISessionFactory>().OpenSession(), Lifestyle.Scoped);
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));