在Orchard模块中使用IBlogService(或任何其他服务)

Jan*_*n_V 3 orchardcms

我正在尝试创建一个控制器,从博客中检索某些博客帖子.我想要检索前20个帖子和20个评分最高的帖子.

为此我创建了一个控制器来检索这些信息.在深入了解标准的Orchard博客模块后,我发现我需要IBlogService或IBlogPostService.我可以看到这些是在BlogPostController中注入的,如下所示:

public BlogPostController(
            IOrchardServices services, 
            IBlogService blogService, 
            IBlogPostService blogPostService,
            IFeedManager feedManager,
            IShapeFactory shapeFactory) 
Run Code Online (Sandbox Code Playgroud)

但这些服务如何连线/连接/注入?我找不到调用构造函数的代码段,也找不到像我在StructureMap中习惯的那样的连线.

我可以在构造函数中添加Iservices,并且Orchard会确保我有正确的对象,或者我之前需要做些什么吗?

目前我的班级看起来像这样(默认):

public class FrontpageController : Controller
{
    public IOrchardServices Services { get; set; }

    public FrontpageController(IOrchardServices services)
    {
        Services = services;
        T = NullLocalizer.Instance;
    }

    public Localizer T { get; set; }

    [HttpGet]
    public ActionResult Index()
    {
        //Do something to get blogposts

        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

mdm*_*mdm 5

Orchard使用名为AutoFac的库通过反转控制使用依赖注入.听起来像是满口,但事实并非如此.从本质上讲,您可以指定在构造函数中的参数需要的服务,并AutoFac自动地解决他们并调用的实现指定接口的类的实例构造函数.

您已经注入IOrchardServices到控制器中,因此您可以对实现的任何其他类/接口执行相同操作IDependency.(IBlogPostService并且IBlogService都继承自IDependency)

要对博客服务执行相同操作,您可以执行以下操作:

public class FrontpageController : Controller
{
    public IOrchardServices Services { get; set; }
    private readonly IBlogService _blogs;
    private readonly IBlogPostService _posts;

    public FrontpageController(IOrchardServices services, IBlogService blogs, IBlogPostService posts)
    {
        Services = services;
        T = NullLocalizer.Instance;
        _posts = posts;
        _blogs = blogs;
    }

    public Localizer T { get; set; }

    [HttpGet]
    public ActionResult Index()
    {
        //Do something to get blogposts

        throw new NotImplementedException();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在您的Index方法中,您可以开始使用_blogs_posts执行与博客相关的操作.