none
Injeção de dependência com parâmetros no construtor RRS feed

  • Pergunta

  • Seguinte eu criei um custom ActionFilterAttribute para auxiliar na auditoria do meu projeto.

    Eis o filtro:

    public class AuditarAttribute : ActionFilterAttribute
        {
            private IDictionary<string, object> _parameters;
            public string Description { get; set; }
            public object[] Args { get; set; }
    
            private readonly IServicoAuditoria _servicoAuditoria;
    
            public AuditarAttribute(string description = "", object[] args = null)
            {
                Description = description;
                Args = args;
            }
    
            public override void OnActionExecuting(ActionExecutingContext filterContext)
            {
                _parameters = filterContext.ActionParameters;
                base.OnActionExecuting(filterContext);
            }
    
            public override void OnActionExecuted(ActionExecutedContext filterContext)
            {
                if (filterContext.Exception == null || filterContext.Controller.ViewData.ModelState.IsValid)
                {
                    var description = "";
                    description += _parameters.Aggregate(Description, (current, kvp) =>
                    GetArgs(kvp.Value));
    
                    /*...*/
                   _servicoAuditoria.CadastrarAuditoria(audito);
                }
    
                base.OnActionExecuted(filterContext);
            }
    
            private string GetArgs(object value)
            {
                if (value == null)
                {
                    return string.Empty;
                }
    
                return
                    string.Format(Description, Args.Select(arg =>
                        value.GetType()
                            .GetProperty(arg.ToString())
                            .GetValue(value, null))
                        .ToArray());
            }
        }


    Agora minha dúvida, como fazer a injeção de dependência do meu serviço para fazer a persistência dos dados sendo que no meu construtor eu passo parâmetros?

    Estou utilizando Unity.

    segunda-feira, 9 de junho de 2014 13:58

Todas as Respostas

  • Bom dia, costumo usar Ninject para Injeção de Dependência e deixo sempre no construtor, no construtor...Abraço!

    segunda-feira, 9 de junho de 2014 14:16
  • Sim eu também, geralmente, deixo sempre no construtor, entretanto minha dúvida é como proceder quando nesse construtor já possui outros parâmetros?
    Se eu adiciono ao construtor, como fica a chamada da classe? Se eu adicionar o serviço junto aos demais parâmetros na chamada eu não estaria quebrando o proposito da DI?
    terça-feira, 10 de junho de 2014 11:19
  • Não tem problema, coloque mais de um parâmetro...eu também uso assim...
    terça-feira, 10 de junho de 2014 12:35
  • Beleza, mas ai então como fica quando eu adicionar esse filtro no controller e ele pedir pra adicionar o parâmetro do serviço?

    O novo construtor ficaria assim:

    public AuditarAttribute(IServicoAuditoria servicoAuditoria, string description = "", object[] args = null)
    {
        _servicoAuditoria = servicoAuditoria;
        Description = description;
        Args = args;
    }

    Mas da erro no controlador, pois não passo o parâmetro do serviço e se eu passar criando um novo serviço não estarei quebrando o DI?

    [HttpPost]
    [ValidateAntiForgeryToken]
    [Auditar("Nova autorização de acesso criada: {0} {1}({2})", new object[] { "Nome", "Sobrenome", "Login" })]
    public ActionResult Criar(UsuarioModel model){
    //...
    }

    terça-feira, 10 de junho de 2014 13:24
  • Dê uma olhada nesse artigo. Lá diz a vantagem e desvantagem de se usar IoC no construtor e mostra uma abordagem mais elegante.

    http://www.macoratti.net/11/07/ioc_di1.htm

    terça-feira, 10 de junho de 2014 19:01
  • Artigos do macoratti como sempre muito bons e também como sempre ficando algo para depois. Faltou os prós e contras da implementação via interface e infelizmente no artigo que ele fez sobre o Unity Framework, não faz se quer referência a esse tipo de implementação. Por hora estou chamando direto o contexto, o que é um grande "furo", mas funciona. Espero que com a medida que fique mais experiente eu consiga resolver esse problema.

    Obrigado.
    quarta-feira, 11 de junho de 2014 12:20