Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc NHibernateunofwork+;NETMVC_Asp.net Mvc_Nhibernate_Transactions_Repository_Unit Of Work - Fatal编程技术网

Asp.net mvc NHibernateunofwork+;NETMVC

Asp.net mvc NHibernateunofwork+;NETMVC,asp.net-mvc,nhibernate,transactions,repository,unit-of-work,Asp.net Mvc,Nhibernate,Transactions,Repository,Unit Of Work,我是第一次使用DDD,所以我是乞丐!那么,让我们假设它非常简单:D 我使用asp.NETMVC2、ddd和nhibernate开发了一个应用程序。我在类库中有一个域模型,在另一个类库中有我的存储库,还有一个asp.net mvc 2应用程序。在我的存储库基类中,我有一个注入的构造和依赖项(我唯一的ISessionFactory对象在global.asax中启动),代码是: public class Repository<T> : IRepository<T> wh

我是第一次使用DDD,所以我是乞丐!那么,让我们假设它非常简单:D 我使用asp.NETMVC2、ddd和nhibernate开发了一个应用程序。我在类库中有一个域模型,在另一个类库中有我的存储库,还有一个asp.net mvc 2应用程序。在我的存储库基类中,我有一个注入的构造和依赖项(我唯一的ISessionFactory对象在global.asax中启动),代码是:

public class Repository<T> : IRepository<T>
    where T : Entidade
{
    protected ISessionFactory SessionFactory { get; private set; }
    protected ISession Session
    {
        get { return SessionFactory.GetCurrentSession(); }
    }

    protected Repository(ISessionFactory sessionFactory)
    {
        SessionFactory = sessionFactory;
    }        

    public void Save(T entity)
    {
        Session.SaveOrUpdate(entity);
    }

    public void Delete(T entity)
    {
        Session.Delete(entity);
    }

    public T Get(long key)
    {
        return Session.Get<T>(key);
    }

    public IList<T> FindAll()
    {
        return Session.CreateCriteria(typeof(T)).SetCacheable(true).List<T>();
    }
}
我听说过NHibernateunofWork,但我不知道:(,我如何配置NHibernateunofWork以使用我的存储库?我应该更改我的简单存储库吗?欢迎提出建议

所以,如果有人读到这里,谢谢!如果能帮助我,我很感激

PS:对不起我的英语


bye=D

会话是NHibernate的工作单元。但您可以随时创建自己的抽象

using (var tx = Session.BeginTransaction) { ...

会话是NHibernate的工作单元,但您始终可以创建自己的抽象

using (var tx = Session.BeginTransaction) { ...

您可以将存储库上的会话设置为公共属性。然后可以执行以下操作:

using(var tx = _repository.Session.BeginTransaction())

请注意,这些都应该位于服务层内部,而不是控制器中。然后控制器应该具有对您的服务的引用。

您可以将存储库中的会话设置为公共属性。然后您可以执行以下操作:

using(var tx = _repository.Session.BeginTransaction())

从某种程度上讲,这些都应该在服务层内部,而不是在控制器中。然后控制器应该有对您的服务的引用。

有一个名为()的优秀库,它提供了内置的强大UnitOfWork实现。版本1.1允许您执行以下操作:

public class Foo
{
    private readonly IRepository<Stuff> _repository;

    public Foo(IRepository<Stuff> repository)
    {
         _repository = repository;
    }

    public void DoSomething()
    {
        using (var scope = new UnitOfWorkScope())
        {
           _repository.Save(a);
           scope.Commit();
        }
    }
}
公共类Foo
{
专用只读IRepository存储库;
公共Foo(IRepository存储库)
{
_存储库=存储库;
}
公共无效剂量测定法()
{
使用(var scope=new UnitOfWorkScope())
{
_储存库。保存(a);
scope.Commit();
}
}
}
它与最新的NHibernate集成,甚至使用NHibernate.Linq来提供一些强大的查询功能。你几乎没有什么东西可以自己构建,而且它可以很好地开箱即用

编辑:


我详细阐述了我的示例,以展示在具有依赖项注入的项目中使用NCommon的完整推荐方法。

有一个名为()的优秀库,它提供了内置的强大UnitOfWork实现。版本1.1允许您执行以下操作:

public class Foo
{
    private readonly IRepository<Stuff> _repository;

    public Foo(IRepository<Stuff> repository)
    {
         _repository = repository;
    }

    public void DoSomething()
    {
        using (var scope = new UnitOfWorkScope())
        {
           _repository.Save(a);
           scope.Commit();
        }
    }
}
公共类Foo
{
专用只读IRepository存储库;
公共Foo(IRepository存储库)
{
_存储库=存储库;
}
公共无效剂量测定法()
{
使用(var scope=new UnitOfWorkScope())
{
_储存库。保存(a);
scope.Commit();
}
}
}
它与最新的NHibernate集成,甚至使用NHibernate.Linq来提供一些强大的查询功能。你几乎没有什么东西可以自己构建,而且它可以很好地开箱即用

编辑:


我详细阐述了我的示例,以展示在依赖项注入项目中使用NCommon的完整推荐方法。

嗨,Jeff,谢谢!我听说过NCommon,但我想知道,我是否需要在global.asax或类似的东西中配置或初始化UnitOfWorkScope,或者我只需要在我的项目中引用并使用它我的存储库(如上面的代码)?您确实需要进行一些简单的配置(如果这是一个web应用程序,则在global.asax中)来告诉NCommon要使用哪种UnitOfWorkScope。然后您可以使用CommonServiceLocator(或您自己的内核)获取存储库实例。NCommon的作者在这里发表了一篇很好的博文:嗨,杰夫,谢谢!我听说过NCommon,但我想知道,我需要在我的global.asax中配置或初始化UnitOfWorkScope或类似的东西,或者我只需要在我的项目中引用,并与我的代表一起使用ository(如上面的代码)?您确实需要进行一些简单的配置(如果这是一个web应用程序,则在global.asax中)来告诉NCommon要使用哪种UnitOfWorkScope。然后您可以使用CommonServiceLocator(或您自己的内核)获取一个存储库实例。NCommon的作者在这里发表了一篇很好的博客文章:Hi-Eptitka,谢谢!如果我创建一个类来访问ISessionFactory(通过在constructor中注入依赖项)并使用GetCurrentSession获取ISession并控制事务,是否符合DDD?您的类不应依赖于任何服务、存储库等。Felipe,这种方法以及您上面详述的方法的问题是,每次对存储库的调用都将导致单独的事务。要么这样,要么这样将会话注入到存储库中。正是由于这个原因,人们经常看到UnitOfWork被实现为一个单独的类,每个会话(asp.net中的每个页面)启动和停止一次,而不是依赖NHibernateHi Eptitka提供的ISession对象,谢谢!如果我创建一个接受ISessionFactory的类E(通过在constructor中注入依赖项)并使用GetCurrentSession获取ISession并控制事务,是否符合DDD?您的类不应依赖于任何服务、存储库等。Felipe,这种方法以及您上面详述的方法的问题是,每次对存储库的调用都将导致单独的事务。要么这样,要么这样将会话注入存储库。正是由于这个原因,人们经常看到一个UnitOfWork被实现为一个单独的类,每个会话(asp.net中的每个页面)启动和停止一次,而不是依赖NHibernateHi Keith提供的ISession对象,谢谢!我听说过服务层,现在我知道了如何实现它:D,谢谢!如果我有一些存储库并调用BeginTransaction