2012-12-07 2 views
1

나는 오차드에만 국한되지 않는 기능을 캡슐화 한 코드를 가지고있다. 그러나 나는 그것을 의존성 주입을 통해 오차드에서 사용할 수 있도록해야한다. 그래서 모든 구성 요소 (유형)를 등록하는 Autofac Module을 구축했지만 Orchard의 Autofac Container에게이를 알려주는 방법을 찾을 수 없습니다. (일반적으로 시작에서) ContainerBuilder, 에에 모듈을 공급함으로써 아니면 이미 내장 된 컨테이너에서 업데이트하여Orchard에서 사용자 정의 빌드 Autofac.Module을 등록하는 방법?

: 내가 빨간색 것과

, 컨테이너에 모듈을 추가하는 방법에는 두 가지가 있습니다 ContainerBuilder를 사용하는 런타임

첫 번째 방법으로 문제에 접근 할 수 있지만 그럴 경우 두 번째 변형을 사용합니까?

답변

2

Autofac.Module에서 파생 된 클래스를 오차 코드 모듈에 추가하기 만하면됩니다. 컨테이너 건설 중 오차드에 의해 자동으로 선택됩니다.

+0

나는 이것을 수행했다는 것을 믿는다 - 나는 자신의 Orchard 모듈 (즉, .csproj)에 공용 클래스 LoaderModule : Autofac.Module을 추가하여 protected override Load (ContainerBuilder builder)를 구현했지만 코드는 그렇지 않다. 어떤 시점에서든 호출됩니다. 편집 : 해결 - 아래 전체 답변을 참조하십시오. – Brondahl

+0

@Piotr you'r 대답 주셔서 감사합니다, orchard가 자동으로 모듈을 선택하는 방법을 명확히 해 주시겠습니까? 왜냐하면 나는 RegisterAssemblyModules() 및 수동 어셈블리 스캔과 같은 것도 볼 수 없었기 때문입니다. –

+0

@BehnamEsmaili 전체 컨테이너 생성 마법은'ShellContainerFactory' 클래스 내에서 발생합니다. 'RegisterAssemblyModules()'를 호출하는 것보다 더 복잡합니다 - 수동적 인 어셈블리 스캔이 있습니다 만, 매우 간접적입니다 ('ShellBlueprint'를 통해). –

1

Piotr Szmyd's answer 근본적으로 정확하지만 여기에 몇 가지 자세한 내용입니다 :

귀하의 오차드 모듈을 사용하면 Orchard.sln 에 추가 한 새로운 .csproj가 csproj에 대한 참조로 Autofac을 추가입니다 (당신이 있는지 확인 Orchard에 포함 된 버전 - 너겟 제외 See here for more details about that problem) 그런 다음 Autofac.Module에서 파생되고 Load (ContainerBuilder)를 구현하는 클래스를 추가합니다. 예 : 추가 참고로

using System; 
using Autofac; 

namespace MyCustom.Module.Namespace 
{ 
    public class LoaderModule : Autofac.Module 
    { 
    protected override void Load(ContainerBuilder builder) 
    { 
     builder.RegisterType<MyClass>().As<IMyInterface>(); 
    } 
    } 
} 

: 은 Autofac 등록 코드 전용 응용 프로그램 시작시 호출됩니다. 사이트가 IIS에 로컬로 있고 코드가 VS에있는 경우 Orcahrd의 동적 컴파일 특성은 코드를 다시 컴파일 할 때 응용 프로그램이 중지되지 않는다는 것을 의미합니다.

이 Autofac 등록 코드를 적용하려면 (그리고 해당 채널을 적용하려면) 응용 프로그램을 종료해야합니다. 그러면 Autofac 등록 코드가 다시로드됩니다.

관련 문제