2012-03-29 6 views
3

ブログから特定のブログポストを取得するコントローラを作成しようとしています。 私はトップ20の投稿&の20のトップ定評のある記事を検索したいと思います。オーチャード・モジュールでIBlogService(またはその他のサービス)を使用する

このため、この情報を取得するコントローラを作成しました。 Orchardの標準的なブログモジュールを掘り下げた後、私はIBlogServiceまたはIBlogPostServiceが必要であることがわかります。

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

しかし、どのようにこれらのサービスは、接続/配線されている/注入された: 私はそうのように、これらはBlogPostControllerに注入されて見ることができますか?コンストラクターが呼び出された部分のコードを見つけることができず、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(); 
    } 
} 

答えて

5

オーチャードはAutoFacというライブラリを使用して、反転の制御を経てdependeny注入を使用しています。現時点では

私のクラスでは、この(デフォルト)のように見えます。口一杯のように聞こえるが、実際にはそうではない。基本的にコンストラクタのパラメータで必要なサービスを指定すると、AutoFacはそれらを自動的に解決し、指定したインタフェースを実装するクラスのインスタンスを使ってコンストラクタを呼び出します。

コントローラにはすでにIOrchardServicesが注入されているため、IDependencyを実装している他のクラス/インターフェイスと同じことができます。その後、あなたは次の操作を行うことができ、ブログサービスと同じことを行うには

を(IBlogPostServiceIBlogService両方が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(); 
    } 
} 

次に、あなたのIndex方法であなただけの_blogsの使用を開始し、_postsにすることができますブログ関連の操作を実行します。

+1

ありがとうございました!私はすでにこのような疑いがありましたが、ソリューション内に配線/セットアップクラス/ファイルが見つかりませんでした。これを試してみよう! –

+0

いいえ心配しています:) AutoFacのドキュメントを読んだり、オートファックを使って何かを書くことをお勧めします。 – mdm

+1

さらに、Orchard.Blogsをこのインタフェースをインジェクトするフィーチャーの依存関係として宣言する必要があります。そうしないと、フィーチャーを使用可能/使用不可にするときに混乱することがあります。依存関係は、module.txtファイルで宣言できます。 –

関連する問題