简单的注射器+流畅的Nhibernate与UnitOfWork

时间:2015-11-13 11:48:46

标签: c# session nhibernate unit-of-work simple-injector

我正在使用简单的注射器和流利的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”以避免此问题?

1 个答案:

答案 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));