2012-03-29 6 views
3

Ich versuche, einen Controller zu erstellen, der bestimmte Blogposts aus dem Blog abruft. Ich möchte die Top 20 Beiträge & die 20 am besten bewerteten Beiträge abrufen.Verwenden Sie den IBlogService (oder einen anderen Dienst) in einem Orchard-Modul

Dafür habe ich einen Controller erstellt, der diese Informationen abrufen wird. Nach dem Einstieg in das Standard-Orchard-Blog-Modul sehe ich, dass ich den IBlogService oder den IBlogPostService brauche. Ich sehe diese injiziert werden in der BlogPostController, etwa so:

public BlogPostController(
      IOrchardServices services, 
      IBlogService blogService, 
      IBlogPostService blogPostService, 
      IFeedManager feedManager, 
      IShapeFactory shapeFactory) 

Aber wie sind diese Dienste verdrahtet/verknüpften/injiziert? Ich kann den Code, in dem der Konstruktor aufgerufen wird, weder finden, noch kann ich eine Verkabelung finden, wie ich sie in StructureMap gewohnt bin.

Kann ich einfach Iservices im Konstruktor hinzufügen und wird Orchard sicherstellen, dass ich die richtigen Objekte habe, oder muss ich vorher etwas tun?

Im Moment meiner Klasse wie diese (Standard) aussieht:

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

Antwort

5

Orchard verwendet dependeny Injektion über Inversion of Control unter Verwendung einer Bibliothek AutoFac genannt. Klingt nach einem Bissen, aber das ist es wirklich nicht. Im Wesentlichen geben Sie die gewünschten Dienste in den Parametern des Konstruktors an, und AutoFac löst sie automatisch auf und ruft den Konstruktor mit Instanzen von Klassen auf, die die von Ihnen angegebene Schnittstelle implementieren.

Sie injizieren bereits IOrchardServices in Ihren Controller, so dass Sie dasselbe mit jeder anderen Klasse/Schnittstelle durchführen können, die IDependency implementiert. (IBlogPostService und IBlogService erben beide von IDependency)

Um mit dem Blogs Dienst das gleiche zu tun, dann können Sie wie folgt vorgehen:

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

Dann in Ihrem Index Methode können Sie einfach starten _blogs und _posts zu verwenden Führen Sie Blog-bezogene Vorgänge aus.

+1

Danke! Ich habe schon so etwas vermutet, aber ich konnte in der Lösung keine Verdrahtung/Setup-Klasse/Datei finden. Werde es ausprobieren! –

+0

Keine Sorge :) Ich würde empfehlen, einige der AutoFac-Dokumentation zu lesen oder etwas mit AutoFac zu schreiben, da ich festgestellt habe, dass es mir wirklich geholfen hat, den ganzen IoC-Kram zu verstehen. – mdm

+1

Darüber hinaus sollten Sie Orchard.Blogs auch als eine Abhängigkeit von allen Features deklarieren, in die Sie diese Schnittstelle injizieren, andernfalls können Sie beim Aktivieren/Deaktivieren von Features in Unordnung geraten. Die Abhängigkeiten können in der Datei module.txt deklariert werden. –

Verwandte Themen