属性注入和/或将控制器添加到备用MenuItem视图

时间:2013-02-06 15:43:06

标签: dependency-injection orchardcms autofac property-injection

我正在尝试(并且失败)在Orchard CMS中使用属性注入工作。

这是必要的,因为下面的代码就像一个视图的代码隐藏(我知道可怕)。原因是视图没有可以使用构造函数注入的控制器,因为这是MenuItem的备用视图,即MenuItemLink-MyCustomMenuItem.cshtml

除此之外不多说,除了注释中的内容(请注意我尝试在下面的代码中设置的属性的NULL注释)。

哦,我也尝试过调整Orchard的LoggingModule中的属性注入代码,但同样对我也不起作用。

我如何:

一个。得到以下属性注入工作? (我很确定无论如何我都会需要它)

湾(如果可能的话)以视图的方式获取我自己的控制器/驱动程序,这样我就可以在控制器上使用构造函数注入了吗?

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(); 
        }

    }

}

1 个答案:

答案 0 :(得分:1)

你绝对不应该在视图中做任何类型的事情。我认为本文描述了一个与您要实现的目标接近的场景:http://www.davidhayden.me/blog/dynamically-injecting-menu-items-in-orchard-cms