Windows 带MEF集成的Autofac
我需要帮助。我使用Autofac容器创建Windows服务。 我使用MEF集成服务为我的服务创建几个可选组件 例如: 单元1Windows 带MEF集成的Autofac,windows,service,mef,autofac,Windows,Service,Mef,Autofac,我需要帮助。我使用Autofac容器创建Windows服务。 我使用MEF集成服务为我的服务创建几个可选组件 例如: 单元1 [Export(typeof(IClass1))] public class Class1 : IClass1 { public void Show() { Console.WriteLine("Hallo from Class1"); } } 单元2 [Export(typ
[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();
}
类程序
{
专用静态IContainer容器{get;set;}
静态void Main(字符串[]参数)
{
//创建您的生成器。
var builder=new ContainerBuilder();
/**查找所选文件夹中的所有模块*/
var catalog=new DirectoryCatalog(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)+@“\modules”,“*Module.dll”);
/**寄存器翅片模块*/
builder.RegisterComposablePartCatalog(目录);
builder.RegisterType().As().SingleInstance();
Container=builder.Build();
var cls=Container.Resolve();
cls.Show();
Console.WriteLine(“类就绪。按Enter键”);
Console.ReadKey(true);
}
}
类MyClass:IMyClass
{
私有只读IClass1_class1;
私有只读IClass1_class3;
私有只读IClass2_class2;
私有只读IClass2_class4;
公共MyClass(IClass1类,IClass2类)
{
_class1=class1;
_类别2=类别2;
_类别3=类别1;
_类别4=类别2;
}
公开展览(
{
_类别1.Show();
Console.WriteLine(“Class1就绪,按Enter键”);
Console.ReadKey(true);
_class2.Show();
Console.WriteLine(“Class1就绪,按Enter键”);
Console.ReadKey(true);
}
}
内部接口IMyClass
{
void Show();
}
在这个例子中,一切都很好。这是我在服务中使用的原则。对于测试启动和调试我的服务,我使用Nuget packages存储库中的service.Helper。
每个人都很好。
但是如果我提前创建安装包安装程序并在系统(Windows 8.1 x64)中安装我的服务,则服务不会启动。
记录系统事件日志中服务写入System.ArgumentNullException的异常。此行中最有可能出现异常
builder.RegisterComposablePartCatalog(目录)
服务不从开始文件夹加载任何模块。拒绝从服务访问他的子文件夹。请帮忙。谢谢。尝试Assembly.GetEntryAssembly().Location而不是Assembly.GetExecutionGassembly().Location