我们在当前项目中使用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));
上面的注册类型适用于具有setter注入(和构造函数注入)的普通类,但显然不适用于属性类。
属性类看起来像这样......
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);
}
甚至可以将依赖项注入属性吗?因为它是由运行时实例化的......
有没有其他方法可以解决依赖关系的问题?