NHibernate с Autofac в рамках ASP.NET (MVC): ITransaction

Причина, что добавление границы слова \b не работало, состоит в том, что Вы не помещали его в предвидении. Таким образом \b будет предпринят после < где это будет всегда соответствовать если < запускает HTML-тэг.

Помещенный это в предвидении как это:

<(?!/?(i|b|h3|h4|a|img)\b)[^>]+>

Это также показывает, как можно поместить / перед списком тегов, а не с каждым тегом.

6
задан Andrey Shchekin 26 October 2009 в 17:48
поделиться

3 ответа

Я недавно опубликовал это:

http://groups.google.com/group/autofac/browse_thread/thread/f10badba5fe0d546/e64f2e757df94e61?lnk=gst&q=transaction#e64f61e757df94 1224] Изменено, так что перехватчик имеет возможность ведения журнала, а атрибут [Transaction] также может использоваться в классе.

[global::System.AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class TransactionAttribute : Attribute
{
}


public class ServicesInterceptor : Castle.Core.Interceptor.IInterceptor
{
    private readonly ISession db;
    private ITransaction transaction = null;

    public ServicesInterceptor(ISession db)
    {
        this.db = db;
    }

    public void Intercept(IInvocation invocation)
    {
        ILog log = LogManager.GetLogger(string.Format("{0}.{1}", invocation.Method.DeclaringType.FullName, invocation.Method.Name));

        bool isTransactional = IsTransactional(invocation.Method);
        bool iAmTheFirst = false;

        if (transaction == null && isTransactional)
        {
            transaction = db.BeginTransaction();
            iAmTheFirst = true;
        }

        try
        {
            invocation.Proceed();

            if (iAmTheFirst)
            {
                iAmTheFirst = false;

                transaction.Commit();
                transaction = null;
            }
        }
        catch (Exception ex)
        {
            if (iAmTheFirst)
            {
                iAmTheFirst = false;

                transaction.Rollback();
                db.Clear();
                transaction = null;
            }

            log.Error(ex);
            throw ex;
        }
    }

    private bool IsTransactional(MethodInfo mi)
    {
        var atrClass = mi.DeclaringType.GetCustomAttributes(false);

        foreach (var a in atrClass)
            if (a is TransactionAttribute)
                return true;

        var atrMethod = mi.GetCustomAttributes(false);

        foreach (var a in atrMethod)
            if (a is TransactionAttribute)
                return true;

        return false;
    }
}
4
ответ дан 17 December 2019 в 00:11
поделиться

Обычно я сам управляю транзакцией ..

public ActionResult Edit(Question q){
try {
 using (var t = repo.BeginTransaction()){
  repo.Save(q);
  t.Commit();
  return View();
 }
 catch (Exception e){
  ...
 }
}
-1
ответ дан 17 December 2019 в 00:11
поделиться

Когда я использую autofac, я использую тот же метод с контейнерной областью, но вместо передачи того же сеанса моим объектам Repository / DAO я передаю UnitOfWork с контейнерной областью. Единица работы имеет это в конструкторе.

    private readonly ISession _session;
    private ITransaction _transaction;

    public UnitOfWork(ISession session)
    {
        _session = session;
        _transaction = session.BeginTransaction();
    }

И удаление:

    public void Dispose()
    {
        try
        {
            if (_transaction != null &&
                            !_transaction.WasCommitted &&
                            !_transaction.WasRolledBack)
                _transaction.Commit();
            _transaction = null;
        }
        catch (Exception)
        {
            Rollback();
            throw;
        }

    }

Я (ab) использую детерминированное удаление в autofac, чтобы управлять этим, и мне это вроде как нравится.

Другое дело, что я в основном нацелен только на среду ASPNet и сознательно решил, что транзакция привязана к веб-запросу. Итак, транзакция по шаблону веб-запроса.

Из-за этого я могу сделать этот код обработки ошибок в IHttpModule:

    void context_Error(object sender, System.EventArgs e)
    {
        _containerProvider.RequestContainer.Resolve<IUnitOfWork>().Rollback();
    }

Я не слишком внимательно изучал NHibernate.Burrow, но уверен, что там что-то есть это делает большую часть этого.

4
ответ дан 17 December 2019 в 00:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: