结构图和注入依赖“在飞行中”

时间:2011-03-11 15:08:54

标签: c# asp.net-mvc structuremap

我正在关注这个优秀的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); 
}

在我的答案最终实施之下。

3 个答案:

答案 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注入的更多详细信息。不幸的是,有些示例使用较旧的语法,但所有想法都适用。