Ninject и AOP

Ninject имеет много расширений. Одно из полезных расширений это Ninject.Extensions.Interception.DynamicProxy. Данное расширение позволяет перехватывать вызовы методов, что позволяет вынести сквозную функциональность из наших модулей. Установим данный пакет и вынесем логику работы с транзакциями в Intercepter (перехватчик).

  1. Установим пакет Ninject.Extensions.Interception.DynamicProxy при помощи менеджера пакетов nuget.
  2. Создадим перехватчик для работы с транзакциями:
    public class TransactionInterceptor : IInterceptor
    {
        public void Intercept(IInvocation invocation)
        {
            using (var tr = TLD.Get<DefaultDatabase>("DbContext").Database.BeginTransaction())
            {
                try
                {
                    invocation.Proceed();
                    //
                    tr.Commit();
                }
                catch (Exception)
                {
                    tr.Rollback();
                    throw new Exception();
                }
            }
        }
    }
    
  3. Создадим атрибут, к которому будет привязан данный перехватчик
    public class TransactionAttribute : InterceptAttribute
    {
        public override IInterceptor CreateInterceptor(IProxyRequest request)
        {
            return request.Context.Kernel.Get<TransactionInterceptor>();
        }
    }
    
  4. Используем так:
    [Transaction]
    public virtual void CreateUser();
    

PS: Перехватчики не обязательно привязывать к атрибутам. Можно привязать их к классу, или к классам реализующий определенный интерфейс и тп.

Ссылки:

По теме:
Устанавливаем и настраиваем Ninject

Ninject это IoC контейнер для .NET платформы. Установим его и настроим. Установим ninject с помощью менеджера nuget Создадим класс который создает Read more

Скрываем публичные свойства, через которых происходит внедрение зависимостей ninject (c#)

Допустим есть свойство, через которое ninject внедряет зависимость [Inject] public IUsersService UsersService { get; set; } И очень хочется скрыть Read more

Получаем данные из appSettings при помощи Ninject

Создадим пользовательский атрибут ValueAttribute, который будет производным от атрибута InjectAttribute. Данный атрибут достает значение из appSettings, а Inject в свою Read more

Настраиваем Ninject для web api и mvc

Создадим три класса NinjectDependencyResolver, NinjectDependencyScope и NinjectRegistrations. В NinjectDependencyScope реализуем интерфейс System.Web.Http.Dependencies.IDependencyScope public class NinjectDependencyScope : IDependencyScope { private IResolutionRoot resolver; internal NinjectDependencyScope(IResolutionRoot Read more

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *