2014-01-18 5 views
2

Мне нужна помощь. Я создаю службу Windows с контейнером Autofac. И я использую службу интеграции MEF для создания нескольких альтернативных компонентов для моей службы.Autofac с интеграцией 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(); 
    } 

В этом примере все отлично работает. Thi я использую в своей службе. Для запуска теста и отладки моего сервиса я использую Service.Helper из репозитория пакетов Nuget. Everithyng работает отлично тоже. Но. Если я создам установочный пакет в Advance installer и установлю свою службу в системе (Windows 8.1 x64), служба не запускается. Исключение регистрации из службы write System.ArgumentNullException в системе Журнал событий. Исключение скорее всего в этой строке

builder.RegisterComposablePartCatalog (catalog);

Служба не загружает модули из начальной папки. Доступ запрещен из службы в его подпапку. Помоги пожалуйста. Благодарю.

ответ

0

Попробуйте Assembly.GetEntryAssembly(). Расположение insted Assembly.GetExecutingAssembly(). Местонахождение

Смежные вопросы