2014-01-18 1 views
2

도움이 필요합니다. Autofac 컨테이너가있는 Windows 서비스를 만듭니다. 그리고 MEF 통합 서비스를 사용하여 내 서비스를위한 몇 가지 대체 구성 요소를 만듭니다. 예를 들어MEF 통합형 오토 팩

:

모듈 모듈 통합을위한 1 개

[Export(typeof(IClass1))] 
    public class Class1 : IClass1 
    { 
     public void Show() 
     { 
       Console.WriteLine("Hallo from Class1"); 
     } 
    } 

모듈 2

[Export(typeof(IClass2))] 
    public class Class2 : IClass2 
    { 
     public void Show() 
     { 
       Console.WriteLine("Hallo from Class2"); 
     } 
    } 

기본 클래스 - 예이 예에서

class Program 
    { 
     private static IContainer Container { get; set; } 

     static void Main(string[] args) 
     { 

       // Create your builder. 
       var builder = new ContainerBuilder(); 

       /** find all modules in selected folder */ 
       var catalog = new DirectoryCatalog(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + @"\modules", "*Module.dll"); 

       /** register finded modules */ 
       builder.RegisterComposablePartCatalog(catalog); 


       builder.RegisterType<MyClass>().As<IMyClass>().SingleInstance(); 

       Container = builder.Build(); 

       var cls = Container.Resolve<IMyClass>(); 

       cls.Show(); 

       Console.WriteLine("Class ready. Press Enter"); 
       Console.ReadKey(true); 
     } 
    } 


    class MyClass: IMyClass 
    { 
     private readonly IClass1 _class1; 
     private readonly IClass1 _class3; 


     private readonly IClass2 _class2; 
     private readonly IClass2 _class4; 

     public MyClass(IClass1 class1, IClass2 class2) 
     { 
       _class1 = class1; 
       _class2 = class2; 

       _class3 = class1; 
       _class4 = class2; 
     } 

     public void Show() 
     { 
       _class1.Show(); 

       Console.WriteLine("Class1 ready. Press Enter"); 
       Console.ReadKey(true); 

       _class2.Show(); 

       Console.WriteLine("Class1 ready. Press Enter"); 
       Console.ReadKey(true); 
     } 
    } 

    internal interface IMyClass 
    { 
     void Show(); 
    } 

모두 잘 작동. 티 나는 내 봉사에서 사용하는 원칙에 따라야한다. 테스트 시작과 디버깅을 위해 Nuget 패키지 저장소의 Service.Helper를 사용합니다. Everithyng도 잘 작동합니다. 하지만. 사전 설치 프로그램에서 설치 패키지를 만들고 시스템 (Windows 8.1 x64) 서비스에 서비스를 설치하지 않으면 서비스가 시작되지 않습니다. 서비스에서 로깅 예외가 발생했습니다. 시스템 이벤트 로그에 System.ArgumentNullException이 기록됩니다. 이 줄의 예외 가능성이 가장 높음

builder.RegisterComposablePartCatalog (catalog);

서비스 시작 폴더의 모듈을로드하지 않습니다. 서비스에서 그의 하위 폴더로 액세스가 거부되었습니다. 도와주세요. 감사.

답변

0

Assembly.GetExecutingAssembly()의 위치 insted. 위치