Dependency injection 属性注入和/或向备用菜单项视图添加控制器

Dependency injection 属性注入和/或向备用菜单项视图添加控制器,dependency-injection,orchardcms,autofac,property-injection,Dependency Injection,Orchardcms,Autofac,Property Injection,我正在尝试(但失败)让财产注入在Orchard CMS中工作 这是必要的,因为下面的代码的行为类似于视图的代码隐藏(我知道这很可怕)。原因是该视图没有我可以使用构造函数注入的控制器,因为这是MenuItem的替代视图,即MenuItemLink MyCustomMenuItem.cshtml 除了注释中的内容(注意我试图在下面的代码中设置的属性的空注释)之外,没有更多的说明 哦,我也尝试过从Orchard的LoggingModule修改属性注入代码,但同样地,这对我也不起作用 我如何: a。让下

我正在尝试(但失败)让财产注入在Orchard CMS中工作

这是必要的,因为下面的代码的行为类似于视图的代码隐藏(我知道这很可怕)。原因是该视图没有我可以使用构造函数注入的控制器,因为这是
MenuItem
的替代视图,即
MenuItemLink MyCustomMenuItem.cshtml

除了注释中的内容(注意我试图在下面的代码中设置的属性的空注释)之外,没有更多的说明

哦,我也尝试过从Orchard的
LoggingModule
修改属性注入代码,但同样地,这对我也不起作用

我如何:

a。让下面的属性注入工作吗?(无论如何,我很确定我会在某个时候需要它)

b。(如果可能)在视图中使用我自己的控制器/驱动程序,这样我就可以在控制器上使用构造函数注入了

using System.Diagnostics;
using System.Xml.Linq;
using Autofac;
using Autofac.Core;
using Orchard;
using Module = Autofac.Module;

namespace MyCo.MyCustomMenuItem.Services 
{

    public class MyCustomMenuItemModule : Module 
    {

        protected override void AttachToComponentRegistration(
            IComponentRegistry componentRegistry, 
            IComponentRegistration registration)
        {
            if (implementationType.ToString() == 
                        "MyCo.MyCustomMenuItem.Services.MyCustomMenuItem") 
            {
                // this does get called, but doesn't have the desired effect
                registration.Activated += (s, e) => 
                         e.Context.InjectUnsetProperties(e);
            }
        }

    }

    public interface IFeedX : IDependency 
    {
        XDocument GetResource();
    }

    public class FeedX : IFeedX
    {
        public XDocument GetResource() 
        {
            return new XDocument();
        }
    }

    public interface IMyCustomMenuItem : IDependency 
    {
        XDocument GetResourceData();

        IFeedX FeedX { get; set; }
    }   

    public class MyCustomMenuItem : IMyCustomMenuItem
    {
        public IFeedX FeedX { get; set; }

        // called direct by razor view
        public XDocument GetResourceData()
        {
            Debug.WriteLine(FeedX); // NULL??

            return FeedX.GetResource(); 
        }

    }

}

你绝对不应该在视图中做任何类似的事情。我认为这篇文章描述了一个接近您试图实现的场景:

您绝对不应该在视图中执行任何类似的操作。我认为这篇文章描述了一个接近您想要实现的场景:

谢谢,我这个周末一定会看一看,看看它是否满足了我的需要。顺便说一句,知道为什么属性注入不起作用吗(假定调用了attach方法)?Orchard依赖于构造函数注入。属性注入只适用于极少数情况,例如定位器,我甚至不确定这些限制是什么。在任何情况下,在这种情况下都没有很好的理由这样做。好的,我看了一下您提供的链接中的代码,但这只是将一些文本注入菜单项,即MenuItem.text=new LocalizedString(tag.TagName)。然而,我希望通过一个视图(或部分视图)为菜单项提供完全定制的html,该视图是从外部源动态填充的。目前,我能找到的唯一方法是通过一个备用视图和一个代码隐藏(使用您链接的示例,我可以在代码中生成html,并将其注入,但html非常重要,因此我想使用一个视图进行维护)。查看HTMLMemueItem内容类型:它有菜单部分、主体部分、公共部分,标识部分和具有原型
MenuItem
。这应该清楚地表明,菜单项只是带有菜单项原型的内容类型,因此您可以构建完全任意的项目类型并添加自己的自定义部分。绝对不需要在视图中使用代码隐藏或肮脏的黑客行为。谢谢,我一定会在这个周末查看一下,看看它是否符合我的需要。顺便说一句,知道为什么属性注入不起作用吗(假定调用了attach方法)?Orchard依赖于构造函数注入。属性注入只适用于极少数情况,例如定位器,我甚至不确定这些限制是什么。在任何情况下,在这种情况下都没有很好的理由这样做。好的,我看了一下您提供的链接中的代码,但这只是将一些文本注入菜单项,即MenuItem.text=new LocalizedString(tag.TagName)。然而,我希望通过一个视图(或部分视图)为菜单项提供完全定制的html,该视图是从外部源动态填充的。目前,我能找到的唯一方法是通过一个备用视图和一个代码隐藏(使用您链接的示例,我可以在代码中生成html,并将其注入,但html非常重要,因此我想使用一个视图进行维护)。查看HTMLMemueItem内容类型:它有菜单部分、主体部分、公共部分,标识部分和具有原型
MenuItem
。这应该清楚地表明,菜单项只是带有菜单项原型的内容类型,因此您可以构建完全任意的项目类型并添加自己的自定义部分。绝对不需要在视图中使用代码隐藏或肮脏的黑客。链接到Orchard中的财产注入,供感兴趣的人使用:(1)和(2)链接到Orchard中的财产注入,供感兴趣的人使用:(1)和(2)