遍历 PRISM 模块并执行各自的 "finalize" 方法
Iterate through PRISM modules and execute respective "finalize" methods
我的应用程序由 Shell 和许多从目录加载的模块组成。我想为这些模块中的每一个添加一个 Finalize() 方法,以便它们可以执行自己所需的 cleanup/shutdown 代码,例如关闭文件、释放套接字、执行 saves/backups 等
我知道这个概念可以通过事件聚合和在关闭时发布事件轻松实现,但我更愿意遍历每个模块并调用此 Finalize() 方法,其中 returns 状态整数显示模块在完成过程中是否遇到任何问题。
到目前为止,我已经创建了以下简单接口,并让相应的模块实现它。
public interface IFinalizeModule
{
int Finalize();
}
是否可以遍历模块目录中的模块并执行类似的操作而不创建它们的其他实例?我发现的最接近的东西是 this post 但我无法理解他的解释
I would place each module's Start method in a separate component (IStartable), register each component in the container with a different Id and resolve/import an IEnumerable to get all instances that have the start method.
此代码不起作用,但这是我正在努力实现的目标
foreach (IModule module in ModuleCatalog)
{
int exitcode = module.Finalize();
if (exitcode != 0)
{
// do something
}
}
模块是短暂的。它们被创建、初始化和垃圾收集。模块的唯一工作是执行注册。
如果您有需要在应用程序关闭时关闭的服务,您必须在即将关闭时通知这些服务。通过他们订阅的事件或创建 RegistryOfServicesThatNeedToBeShutDown
.
扩展我的评论的示例(如果您坚持在模块级别进行清理):
class MyModule : IModule
{
public void Initialize()
{
_container.RegisterType<IMyService, DisposeMe>( new ContainerControlledLifetimeManager() );
_container.RegisterType<IMyOtherService, DisposeMeToo>( new ContainerControlledLifetimeManager() );
_container.RegisterType<IModuleCleanUp, CleanUpMyModule>( nameof( MyModule ) );
}
private class CleanUpMyModule : IModuleCleanUp
{
void Finalize()
{
_container.Resolve<IMyService>().Dispose();
_container.Resolve<IMyOtherService>().Dispose();
}
}
}
现在您有一个常规模块及其清理代码并排放置。但是代码看起来有点难看,还有需要注意的地方:
- 如果有人在清理后解决
IMyService
,您就完成了
- 您甚至不知道注册为
IMyService
的类型是否需要清理:在 MyModule
之后初始化的另一个模块可能会为 IMyService
[=27 注册一个不同的类型=]
我的应用程序由 Shell 和许多从目录加载的模块组成。我想为这些模块中的每一个添加一个 Finalize() 方法,以便它们可以执行自己所需的 cleanup/shutdown 代码,例如关闭文件、释放套接字、执行 saves/backups 等
我知道这个概念可以通过事件聚合和在关闭时发布事件轻松实现,但我更愿意遍历每个模块并调用此 Finalize() 方法,其中 returns 状态整数显示模块在完成过程中是否遇到任何问题。
到目前为止,我已经创建了以下简单接口,并让相应的模块实现它。
public interface IFinalizeModule
{
int Finalize();
}
是否可以遍历模块目录中的模块并执行类似的操作而不创建它们的其他实例?我发现的最接近的东西是 this post 但我无法理解他的解释
I would place each module's Start method in a separate component (IStartable), register each component in the container with a different Id and resolve/import an IEnumerable to get all instances that have the start method.
此代码不起作用,但这是我正在努力实现的目标
foreach (IModule module in ModuleCatalog)
{
int exitcode = module.Finalize();
if (exitcode != 0)
{
// do something
}
}
模块是短暂的。它们被创建、初始化和垃圾收集。模块的唯一工作是执行注册。
如果您有需要在应用程序关闭时关闭的服务,您必须在即将关闭时通知这些服务。通过他们订阅的事件或创建 RegistryOfServicesThatNeedToBeShutDown
.
扩展我的评论的示例(如果您坚持在模块级别进行清理):
class MyModule : IModule
{
public void Initialize()
{
_container.RegisterType<IMyService, DisposeMe>( new ContainerControlledLifetimeManager() );
_container.RegisterType<IMyOtherService, DisposeMeToo>( new ContainerControlledLifetimeManager() );
_container.RegisterType<IModuleCleanUp, CleanUpMyModule>( nameof( MyModule ) );
}
private class CleanUpMyModule : IModuleCleanUp
{
void Finalize()
{
_container.Resolve<IMyService>().Dispose();
_container.Resolve<IMyOtherService>().Dispose();
}
}
}
现在您有一个常规模块及其清理代码并排放置。但是代码看起来有点难看,还有需要注意的地方:
- 如果有人在清理后解决
IMyService
,您就完成了 - 您甚至不知道注册为
IMyService
的类型是否需要清理:在MyModule
之后初始化的另一个模块可能会为IMyService
[=27 注册一个不同的类型=]