2017-11-24 14 views
2

예 : 다른 DB에 저장된 국가 카탈로그가 있으며 일부 ContentPart의 속성으로 사용해야합니다. Orchard 배선을 많이 방해하지 않고 연결하려고합니다.외부 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); 
    } 
} 

업데이트 :

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

하지만이 할 수있는 내 코드에서이 Using External Data with Orchard (25 분 정도) 비디오에서

, 그는이 코드로 필요한 일을 할 것 같다 비디오에서 모든 참조가 있지만 "ProductField"가 사용자 정의 유형인데도 "로더"기능을 찾지 못합니까? 여부 나머지, WCF 등,하지만 논리를 통해 수, 당신은 당신의 외부 데이터를로드하는 방법

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

가 나도 몰라 :

답변

2

그래서 그 부분에 게으른 필드,이 같은 것입니다 맞춤 서비스에 그냥 던져 넣으십시오.

+0

정말 고마워. orchard가 나머지 로직을 처리하기에 충분한 OnActivated 함수입니까? 아니면 모든 이벤트에 대해 동일한 작업을 수행해야합니까? (OnCreated, OnCreating ... 등) – Velair

+0

그냥 onactivated. 이것은 객체 계층 구조가 생성되었을 때 호출됩니다. 가장 낮은 수준의 이벤트입니다. Oncreated는 컨텐트 아이템이 생성되었을 때를 의미합니다. :) – Hazza