Мы используем StructureMap в качестве контейнера в моем текущем проекте, и все работало хорошо, пока нам не пришлось внедрить зависимости в используемый нами настраиваемый атрибут.
Во-первых, код для регистрации содержимого в контейнере будет выглядеть следующим образом ...
Container = new Container();
Registry = new Registry();
ServiceLocator = new StructureMapServiceLocator(Container);
Registry.For<IServiceLocator>().Use(ServiceLocator);
Registry.For<IHitCounter>().Add<HitCounter>();
Registry.For<IHitCountAttribute>().Use<HitCountAttribute>();
Registry.SetAllProperties(policy => policy.OfType<IHitCounter>());
Container.Configure(config => config.AddRegistry(Registry));
Вид вышеописанной регистрации работает для нормального класса с внедрением сеттера (и инжектором конструктора), но, очевидно, не для класса атрибута.
Класс атрибута может выглядеть следующим образом ...
public class HitCountAttribute : ActionFilterAttribute, IHitCountAttribute
{
public IHitCounter HitCounter { get; set; }
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
HitCounter.Count(HttpContext.Current.Request.Url.ToString());
base.OnResultExecuted(filterContext);
}
}
Интерфейс выглядит следующим образом ...
public interface IHitCountAttribute
{
IHitCounter HitCounter { get; set; }
void OnResultExecuted(ResultExecutedContext filterContext);
}
Можно ли даже ввести зависимости в атрибут? Как это создается во время выполнения ...
Есть ли другой способ решить проблему с зависимостями?