Как определить зависимость для использования в атрибуте с помощью автофактора - PullRequest
1 голос
/ 13 сентября 2011

У меня есть приложение asp.net mvc, и я разрабатываю пользовательский атрибут для защиты некоторых конечных точек wcf, наследуемых от CodeAccessSecurityAttribute.

Мне трудно выяснить, как бы я использовал autofac для добавления зависимости сервиса, которую я могу использовать в этом атрибуте.

[Serializable]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class SecuredResourceAttribute : CodeAccessSecurityAttribute
{
    public ISecurityService SecurityService { get; set; }

    public SecuredResourceAttribute(SecurityAction action) : base(action)
    {
    }

    public override IPermission CreatePermission()
    {
        // I need access to the SecurityService here
        // SecurityService == null :(
    }
}

Я попытался из приложения запустить регистрацию для автоматического подключения свойства, но это не работает. Каков наилучший способ добавить зависимость в атрибут?

builder.RegisterType<SecuredResourceAttribute>().PropertiesAutowired();

Спасибо

1 Ответ

1 голос
/ 23 сентября 2011

То, как вы подходите к этому, не даст результатов по нескольким причинам:

  • Регистрация атрибута в autofac ничего не изменит, поскольку вы не используете autofac для создания экземпляра атрибута.
  • Атрибуты применяются перед выполнением кода и, таким образом, полагаются на постоянные входные данные.

Вам понадобится использовать шаблон расположения службы в вашем методе CreatePermission(), чтобы найти SecurityService, как я предполагаю, вызов CreatePermission() происходит после установки контейнера (а конструктор - нет!)

Имейте в виду, ServiceLocation будет препятствовать тестированию вашего класса, так как вам придется настраивать / настраиватьуказатель сервиса для каждого теста.

Пожалуйста, используйте с осторожностью

Вы должны начать свой путь в ServiceLocation здесь , но, честно говоря, это должно вызвать у вас вопросываш дизайн.Является ли атрибут лучше всего подходит для роли, которую вы задали?Возможно, вам стоит взглянуть на Aspect-Oriented Programming как PostSharp

...