] [
] Я использую [
] [
] [
] В настоящее время я использую 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();
}
}
}
]