我想开发一个Windows服务托管的wcf Web服务,它将充当任务执行管理和报告服务。每个任务都将表示为.net程序集,任务名称和DLL路径将处于中央配置中。该任务至少主要有一个Execute和Stop方法。 在wcf服务运行且其他任务正在运行时,应该可以加载,执行,停止和卸载任务。每个任务的一个实例可以同时运行。具有异常的一个任务不应该中止其他任务。我正在考虑像
这样的方法[OperationContract]
bool Load(string taskName);
[OperationContract]
bool Run(string taskName);
我正在考虑如何按需完成此加载和卸载任务以及隔离。一些选项可能是使用Reflection,MAF(System.Addin)等。加载的初始性能可以接受,因为这种加载/卸载很少发生。
实现这一目标的最佳方式(库,API,框架等)是什么。
答案 0 :(得分:1)
我不能说最好的,但唯一的(!)方法涉及多个应用程序域。因为您无法卸载程序集,只能卸载appdomain,因此属于任务的所有程序集都必须加载到单独的appdomain中。
这在技术上非常简单。魔鬼在细节。 MAF可能是一个很好的框架。
答案 1 :(得分:0)
我只想定义每个提供的程序集必须实现的接口。
我正在开发一个实现管道行为的项目,这段代码可能对您有所帮助:它使用linq搜索所有已加载的程序集,以查找实现特定接口且具有空构造函数和自定义属性的类(您可能不需要自定义属性部分) - 并且它实例化了找到的每个项目的实例。
我很欣赏这并不是你所追求的,但希望它会指出你正确的方向 - 希望它有所帮助:)。
var processingModules = from mod in
AppDomain.CurrentDomain.GetAssemblies().SelectMany(assembly =>
{
return from t in assembly.GetTypes()
where
t.GetInterfaces().Contains(typeof(IProcessingModule<T>))
&& t.GetConstructor(Type.EmptyTypes) != null
&& t.GetCustomAttributes(typeof(ProcessModuleAttribute), true)
.Cast<ProcessModuleAttribute>()
.Select(e => e.Processes.Contains(manager.Name))
.Contains(true)
select Activator.CreateInstance(t) as IProcessingModule<T>;
})
orderby mod.ModuleOrder
select mod;