我正在关注这个优秀的article,以便在mvc.net框架v2中创建自己的属性。 作者Simone Chiaretta使用Ninject在ActionFilter中使用属性[Inject]在其类中的依赖关系中注入依赖。
我想知道结构图是否可以使用相同的技术。
我希望能够提供足够的细节,如果没有,请问...;)
你的,
更新1:
这是一些启发我的问题的代码
public class GreetingAttribute :
ActionFilterAttribute,
ISuperActionFilter,IGreetingAttribute
{
**[Inject]**
public IGestioneUtenti _service { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
_service.Elenca();
base.OnActionExecuting(filterContext);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
ViewResult result = filterContext.Result as ViewResult;
_service.Elenca();
if (result != null)
{
result.ViewData["Title"] += " - " ;
}
}
}
我希望能够拥有此[Inject]属性。所以我的InvokeActionMethodWithFilters看起来像这样:
protected override ActionExecutedContext InvokeActionMethodWithFilters(
ControllerContext controllerContext, IList<IActionFilter> filters,
ActionDescriptor actionDescriptor, IDictionary<string, object> parameters)
{
foreach (IActionFilter actionFilter in filters)
{
ISuperActionFilter superActionFilter =
actionFilter as ISuperActionFilter;
if (superActionFilter != null)
{
ObjectFactory.DoInjectionForMarkedAttribute(actionFilter);
}
}
return base.InvokeActionMethodWithFilters(
controllerContext, filters, actionDescriptor, parameters);
}
在我的答案最终实施之下。
答案 0 :(得分:2)
我的最终解决方案(到目前为止,因为周末来得太快了......):
公共类GreetingAttribute: ActionFilterAttribute, ISuperActionFilter,IGreetingAttribute { 的 [SetterProperty] 强> public IMyService _service {get;组; } 强>
public override void OnActionExecuting(ActionExecutingContext
filterContext) { _service.Elenca(); base.OnActionExecuting(filterContext); }
public override void OnActionExecuted(ActionExecutedContext
filterContext) { ViewResult result = filterContext.Result as ViewResult; _service.Elenca();
if (result != null) { result.ViewData["Title"] += " - " ; } } }
和StructureMapControllerActionInvoker:
公共课 StructureMapControllerActionInvoker: ControllerActionInvoker {public StructureMapControllerActionInvoker() { } protected override ActionExecutedContext InvokeActionMethodWithFilters( ...) { foreach (IActionFilter actionFilter in filters) { **ObjectFactory.Container.BuildUp(actionFilter);** } return base.InvokeActionMethodWithFilters( controllerContext, filters, actionDescriptor,
参数); } }
感谢您的所有帮助
答案 1 :(得分:1)
是的,请使用ObjectFactory.GetInstance<WhatYouWant>()
与您发布的文章中的Ninject的KernelContainer.Kernel.Get<WhatYouWant>()
等效的结构图。
您无法将扩展方法设为ObjectFactory
,因为它是一个静态类。如果您查看该文章,您会看到NinjectControllerActionInvoker
在构造函数中接受IKernel
。
同样,您可以在构造函数中收到包含IServiceProvider
的{{1}}实现。例如:
ObjectFactory
然后,在public class StructureMapServiceProvider: IServiceProvider
{
public object GetService(Type serviceType)
{
return ObjectFactory.GetInstance(serviceType);
}
public T GetService<T>()
{
return ObjectFactory.GetInstance<T>();
}
}
内,你可以写
StructureMapActionInvoker.InvokeActionMethodWithFilters
..不客气
答案 2 :(得分:0)
SetterProperty属性等同于Ninject的Inject。
另外,请查看此博客文章:http://codebetter.com/jeremymiller/2008/10/09/setter-injection-in-structuremap-2-5/,了解有关结构图中setter注入的更多详细信息。不幸的是,有些示例使用较旧的语法,但所有想法都适用。