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

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

  1. Реализация ValueAttribute:
    public class ValueAttribute : InjectAttribute
    {
        private static NameValueCollection _appSettings = WebConfigurationManager.
    AppSettings as NameValueCollection;
    
        public string Value { get; private set; }
    
        public ValueAttribute(string key)
        {
            Value = _appSettings[key];
        }
    }
    
  2. Добавим такие привязки для каждого типа string, long, int, bool соответственно
    kernel.Bind<string>().ToMethod(context =>
    {
        return context.Request.Target.Member.GetCustomAttributes(true).OfType<ValueAttribute>().
    FirstOrDefault().Value;
    });
    kernel.Bind<long>().ToMethod(context =>
    {
        return Convert.ToInt64(context.Request.Target.Member.GetCustomAttributes(true).
    OfType<ValueAttribute>().FirstOrDefault().Value);
    });
    kernel.Bind<int>().ToMethod(context =>
    {
        return Convert.ToInt32(context.Request.Target.Member.GetCustomAttributes(true).
    OfType<ValueAttribute>().FirstOrDefault().Value);
    });
    kernel.Bind<bool>().ToMethod(context =>
    {
        return Convert.ToBoolean(context.Request.Target.Member.GetCustomAttributes(true).
    OfType<ValueAttribute>().FirstOrDefault().Value);
    });
    
  3. Используем наш атрибут так:
    [Value("webpages:Version")]
    public string Version { get; set; }
    
  4. Сделаем так же привязки для списков List<string>, List<long>, List<int>, List<bool>
    kernel.Bind<Values<string>>().ToMethod(context =>
    {
        List<string> list = context.Request.Target.Member.GetCustomAttributes(true).
    OfType<ValueAttribute>().FirstOrDefault().Value
            .Split(',')
            .Select(x => x.Trim()).ToList();
    
        Values<string> values = new Values<string>();
        foreach (string v in list)
            values.Add(v);
        return values;
    });
    kernel.Bind<Values<long>>().ToMethod(context =>
    {
        List<long> list = context.Request.Target.Member.GetCustomAttributes(true).
    OfType<ValueAttribute>().FirstOrDefault().Value
            .Split(',')
            .Select(x => Convert.ToInt64(x.Trim())).ToList();
    
        Values<long> values = new Values<long>();
        foreach (long v in list)
            values.Add(v);
        return values;
    });
    kernel.Bind<Values<int>>().ToMethod(context =>
    {
        List<int> list = context.Request.Target.Member.GetCustomAttributes(true).
    OfType<ValueAttribute>().FirstOrDefault().Value
            .Split(',')
            .Select(x => Convert.ToInt32(x.Trim())).ToList();
    
        Values<int> values = new Values<int>();
        foreach (int v in list)
            values.Add(v);
        return values;
    });
    kernel.Bind<Values<bool>>().ToMethod(context =>
    {
        List<bool> list = context.Request.Target.Member.GetCustomAttributes(true).OfType<ValueAttribute>().FirstOrDefault().Value
            .Split(',')
            .Select(x => Convert.ToBoolean(x.Trim())).ToList();
    
        Values<bool> values = new Values<bool>();
        foreach (bool v in list)
            values.Add(v);
        return values;
    });
    

    Класс Values это производный класс от List

    public class Values<T> : List<T>
    {
    }
    

    Почему я добавил класс Values? Потому что по списками примитивных типов Ninject работать не хочет.

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

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

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

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

Ninject и AOP

Ninject имеет много расширений. Одно из полезных расширений это Ninject.Extensions.Interception.DynamicProxy. Данное расширение позволяет перехватывать вызовы методов, что позволяет вынести сквозную 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 не будет опубликован. Обязательные поля помечены *