Autofac PropertiesAutowired - É possível ignorar uma ou mais propriedades?
Apesar do conselho de passar as dependências pelo construtor, eu descobri que o custo de desenvolvimento de ter construtores sem parâmetros e depois conectar automaticamente todas as propriedades de tudo é significativamente menor e facilita muito o desenvolvimento e a manutenção do aplicativo. No entanto, às vezes (em um modelo de exibição, por exemplo), tenho uma propriedade registrada no contêiner, mas não desejo preencher na construção (por exemplo, o item selecionado vinculado a um contêiner).
Existe alguma maneira de dizer ao contêiner que ignore determinadas propriedades quando liga automaticamente o resto?
No momento, estou apenas redefinindo as propriedades marcadas com um atributo no evento on ativado a la:
public static IRegistrationBuilder<TLimit, ScanningActivatorData, TRegistrationStyle>
PropertiesAutowiredExtended<TLimit, TRegistrationStyle>(
this IRegistrationBuilder<TLimit, ScanningActivatorData, TRegistrationStyle> builder)
{
builder.ActivatorData.ConfigurationActions.Add(
(type, innerBuilder) =>
{
var parameter = Expression.Parameter(typeof(object));
var cast = Expression.Convert(parameter, type);
var assignments = type.GetProperties()
.Where(candidate => candidate.HasAttribute<NotAutowiredAttribute>())
.Select(property => new { Property = property, Expression = Expression.Property(cast, property) })
.Select(data => Expression.Assign(data.Expression, Expression.Default(data.Property.PropertyType)))
.Cast<Expression>()
.ToArray();
if (assignments.Any())
{
var @action = Expression
.Lambda<Action<object>>(Expression.Block(assignments), parameter)
.Compile();
innerBuilder.OnActivated(e =>
{
e.Context.InjectUnsetProperties(e.Instance);
@action(e.Instance);
});
}
else
{
innerBuilder.OnActivated(e => e.Context.InjectUnsetProperties(e.Instance));
}
});
return builder;
}
Existe uma maneira melhor de fazer isso?