2017-11-24 12 views
2

例:私は別のDBに保存されている国のカタログを持っていますので、一部のContentPartでプロパティとして使用する必要があります。私はオーチャードの配線にあまり干渉することなく接続しようとしています。外部DBからカタログを読み込み、ContentRecordsとしてContentPartsにリンクします。

public class MoviePart : ContentPart<MoviePartRecord> 
{ 
    public IEnumerable<CountryRecord> Countries 
    { 
     get 
     { 
      return Record.Countries.Select(r => r.CountryRecord); 
     } 
    } 
} 

CountryRecordsとMoviePartsの関係はオーチャードDBになりますが、CountryRecordデータが別のDBです。私は、読み取りアクセスが必要ですが、私は取得していないと、他のソースを使用するハンドラーをオーバーライドする方法。

ContentHandlerを作成してすべてのメソッドをオーバーライドし、新しいリポジトリを外部ソースとともに使用する別のStorageFilterを作成する必要がありますか?ハンドラに新しいリポジトリを挿入するにはどうすればよいですか?

public class CountryPartHandler : ContentHandler 
{ 
    public CountryPartHandler(IRepository<CountryPartRecord> repository) 
    { 
     Filters.Add(StorageFilter.For(repository)); 
    } 

    protected override void Loading(LoadContentContext context) 
    { 
     base.Loading(context); 
    } 
} 

アップデート:このUsing External Data with Orchard(25分程度)ビデオで

、彼はこのコードで私が必要なものをやっているように見える:

public ProductPartHandler(IRepository<ProductPartRecord> repository, Work<IProductService> productServiceWork) 
    { 
     Filters.Add(StorageFilter.For(repository)); 

     OnActivated<ProductPart>((context, part) => { 
      part.ProductField.Loader(() => productServiceWork.Value.GetProduct(part.Id)); 
     }); 
    } 

しかし、それができる私のコードで私はビデオからのすべての参照を持っているにもかかわらず、 "ローダー"関数を見つけることができないので、おそらくProductFieldはカスタムタイプですか?

答えて

2

だからそれは、一部にこのようなもの怠惰なフィールドです:

public class MyPart : ContentPart { 
    internal readonly LazyField<CustomData> CustomDataField = new LazyField<CustomData>(); 

    public CustomData CustomData { 
     get { return CustomDataField.Value; } 
    } 
} 

public class CustomData { 
    ... 
} 

public class MyPartHandler : ContentPartHandler { 

    private ICustomService _customService; 

    public MyPartHandler(ICustomService customService){ 
     _customService = customService; 
     OnActivated<MyPart>(Initialize); 
    } 

    private void Initialize(ActivatedContentContext context, MyPart part){ 
     part.CustomDataField.Loader(() => { 
      return _customService.Get(part.ContentItem.Id); 
     }); 
    } 
} 

私は休みを経由するかどうか、WCFなど、あなたが外部データをロードする方法を知りませんが、ロジックはできますカスタムサービスに投げられるだけです

+0

本当にありがとうございます。 Orchardが残りのロジックを処理するためにOnActivated関数が十分であるか、すべてのイベントに対して同じ処理を行う必要がありますか? (OnCreated、OnCreating ...など) – Velair

+0

ただオンになっています。これは、オブジェクト階層が作成されたときに呼び出されます。これは私が信じる最低レベルのイベントです。 Oncreatedは、コンテンツアイテムが作成されたときのものです。 – Hazza

関連する問題