] Нужен простой пример использования nhibernate + единица работы + шаблон репозитория + уровень обслуживания + ninject [

] [

] Я использую [

] [

    ] [
  • ] nhibernate + беглый nhibernate [
  • ] [
  • ] asp.net mvc 3 [
  • ] [
  • ] нинджект [
  • ] [

] [

] В настоящее время я использую nhibernate, ninject с шаблоном репозитория и служебными уровнями. [

] [

] Итак, у меня есть это [

] [

] нинджект [

] [

 public class NhibernateSessionFactory
    {
        public ISessionFactory GetSessionFactory()
        {
           ISessionFactory fluentConfiguration = Fluently.Configure()
                                                  .Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("ConnectionString")))
                                                  .Mappings(m => m.FluentMappings.AddFromAssemblyOf().Conventions.Add(ForeignKey.EndsWith("Id")))
                                                  .ExposeConfiguration(cfg => cfg.SetProperty("adonet.batch_size", "20"))
                                                  .ExposeConfiguration(c => c.SetProperty("generate_statistics", "true"))
                                                  //.ExposeConfiguration(BuidSchema)
                                                  .BuildSessionFactory();

            return fluentConfiguration;
        }

        private static void BuidSchema(NHibernate.Cfg.Configuration config)
        {
            new NHibernate.Tool.hbm2ddl.SchemaExport(config).Create(false, true);
        }


 public class NhibernateSessionFactoryProvider : Provider
    {   
        protected override ISessionFactory CreateInstance(IContext context)
        {
            var sessionFactory = new NhibernateSessionFactory();
            return sessionFactory.GetSessionFactory();
        }
    }


   public class NhibernateModule : NinjectModule
    {
        public override void Load()
        {
            Bind().ToProvider().InSingletonScope();
            Bind().ToMethod(context => context.Kernel.Get().OpenSession()).InRequestScope()
                                                                                      .OnActivation(StartTransaction)
                                                                                      .OnDeactivation(CommitTransaction);
        }

        public void CommitTransaction(ISession session)
        {

            if (session.Transaction.IsActive)
            {
                session.Transaction.Commit();
            }

        }

        public void StartTransaction(ISession session)
        {
            if (!session.Transaction.IsActive)
            {
                session.BeginTransaction();
            }
        }
    }

] [

] Итак, я создаю свою фабрику сеансов nhibernate один раз на время существования приложения, а затем использую ее для предоставления сеансов, когда мне это нужно. [

] [

] Одно начало транзакции Я запускаю транзакцию и в конце закрываю транзакцию. [

] [

] Причина, по которой я сделал это, заключалась в том, что, когда я использовал профилировщик nhibernate, я получал множество предупреждений об использовании [] неявных транзакций [] Это своего рода накладывание на проблему, но никогда не исправляло ее (это сократите количество, но все, что загружено лениво, по-прежнему вызывает эту проблему). [

] [

] пример репо [

] [

 public class CalendarRepo : ICalendarRepo
    {
        private readonly ISession session;

        public CalendarRepo(ISession session)
        {
            this.session = session;
        }

        public List RepeatingAppointments(int repeatingId)
        {

            List calendarAppointments = session.Query().Where(x => x.RepeatingId == repeatingId && x.RepeatingId != 0)
                                                                                                 .Take(QueryLimits.Appointments)
                                                                                                  .ToList();
            return calendarAppointments;

        }
    }

] [

] уровень обслуживания [

] [

 public class CalendarService : ICalendarService
    {
        private readonly ICalendarRepo calendarRepo;


        public CalendarService(ICalendarRepo calendarRepo)
        {
            this.calendarRepo = calendarRepo;


        }
        // normally would return something and take in params
         public void SampleServiceMethod()
        {
            // do some checks if needed
            // call up the repository
            // call commit 
            // done.
        }
    }

] [

] Так что это в основном то, что у меня есть. [

] [

] Я хотел бы использовать шаблон единицы работы, чтобы у меня было больше советов и я правильно выполнял операции с транзакциями ([], поскольку сейчас мне сказали, что я делаю их не совсем правильно []) [

] [

] Итак, я ищу простой пример того, как заставить их всех работать вместе и выяснить, насколько мне нужно изменить то, что у меня есть на данный момент. [

] [

] Большинство руководств, которые я видел, сложнее, чем мне хотелось бы. Большинство из них используют TDD и делают общие репозитории, что хорошо, но прежде чем я перейду к этому этапу, я хотел бы увидеть учебник, который делает что-то просто, даже если он повторяет код. [

] [

] [] Изменить [] [

] [


] [

] Я поигрался с этим и пришел к очень простому примеру. Я не уверен, что делаю это правильно.[

] [

] [] Ninject [] [

] [

/// 
/// Load your modules or register your services here!
/// 
/// The kernel.
private static void RegisterServices(IKernel kernel)
{

   kernel.Bind().ToProvider().InSingletonScope();
   kernel.Bind().ToMethod(context => context.Kernel.Get().OpenSession()).InRequestScope();
   kernel.Bind().To();
   kernel.Bind().To();
   kernel.Bind().To();

}  

] [

] Заводской класс nhibernate показан в исходном посте. [

] [

 // Controller
  public class Default1Controller : Controller
    {
        private readonly ITable1Service table1Service;
        //
        // GET: /Default1/
        public Default1Controller(ITable1Service table1Service)
        {
            this.table1Service = table1Service;
        }

        public ActionResult Index()
        {
            table1Service.Save();
            return View();
        }

    }

] [

] [] // домен [] [

] [

  public class Table1
    {
        public virtual int Id { get; private set; }
        public virtual string C1 { get;  set; }
        public virtual string C2 { get; set; }
    }

] [

] [] // Fluent Mapping [] [

] [

  public class Table1Mapping : ClassMap
    {
        public Table1Mapping()
        {
            Id(x => x.Id);
            Map(x => x.C1);
            Map(x => x.C2);
        }
    }

] [

] [] // Репо [] [

] [

 public class Table1Repo : unitofwork.Models.Repository.ITable1Repo
    {
        private readonly ISession session;

        public Table1Repo(ISession session)
        {
            this.session = session;
        }

        public void Create(Table1 tbl1)
        {
            session.Save(tbl1);
        }
    }

] [

] [] // уровень обслуживания [] [

] [

 public class Table1Service : unitofwork.Models.Service.ITable1Service
    {
        private readonly ITable1Repo table1Repo;
        private readonly IUnitofWork unitOfWork;
        public Table1Service(ITable1Repo table1Repo, IUnitofWork unitOfWork)
        {
            this.table1Repo = table1Repo;
            this.unitOfWork = unitOfWork;
        }

        public void Save()
        {
            Table1 a = new Table1();
            a.C1 = "test";
            a.C2 = "test2";

            table1Repo.Create(a);
            unitOfWork.Commit();


        }
    }

] [

] [] // Единица работы [] [

] [

public class UnitofWork : unitofwork.Models.IUnitofWork
    {
        private readonly ITransaction transaction;
        private readonly ISession session;

        public UnitofWork(ISession session)
        {
            this.session = session;
            session.FlushMode = FlushMode.Auto;
            transaction = session.BeginTransaction(IsolationLevel.ReadCommitted);
        }

        public void Commit()
        {
            if (!transaction.IsActive)
            {
                throw new InvalidOperationException("Oops! We don't have an active transaction");
            }
            transaction.Commit();
        }

        public void Rollback()
        {
            if (transaction.IsActive)
            {
                transaction.Rollback();
            }
        }

        public void Dispose()
        {
            if (session.IsOpen)
            {
                session.Close();
            }
        }
    }

]

17
задан Community 23 May 2017 в 12:09
поделиться