我目前正在建立一个MEF项目,以便我可以学习如何在实际应用中使用它。我已成功导入DataHandler模块以提供数据库连接和其他集中式数据库操作。
现在我正在考虑为其他导入模块提供方法的方法。例如,如果安全模块需要连接到数据库,则它可以请求数据库连接。现在,我有一种模块可以检测DataHandler是否可用,因为Host应用程序将其公开。所以我想知道是否有办法使用EventAggregator发布一种事件,其中订阅者(安全模块)只是触发一个事件并获得一个DbConnection
对象作为回报。
如果EventAggregator是答案,我可以使用一些提示。请记住,我仍在研究......不只是要求 teh codez 。如果有更好的解决方案,我对选项感兴趣。
我目前正在Denis Vuyka
审核这篇文章EventAggregator看起来可能不是正确的工具。我可以在我的主机应用程序中实现某种松散耦合的消息传递吗?服务定位器或命令模式是否可以实现?
答案 0 :(得分:2)
听起来您正在寻找服务定位器,而不是EventAggregator。
但是,如果您已经使用MEF注入这些服务,为什么还要通过服务定位器请求服务?如果您需要在运行时稍后获取服务,则可以注入Lazy<T>
或工厂。
答案 1 :(得分:1)
我通过导出主应用程序界面将配置传递给所有模块。您可以在主应用程序中托管数据库接口的单个实例。
主机应用程序导出其自身,所有插件都导入它并可以访问其接口。请参阅下面的示例:
接口:
public interface IMainApp
{
ConfigClass Config { get; set; }
}
主机应用:
[Export(typeof(IMainApp))]
public class Host : IMainApp
{
public Host()
{ /* Compose parts etc here..? */ }
public ConfigClass Config { get; set; }
[Import(typeof(IModule))]
public List<IModule> LoadedModules { get; set; }
}
插件组装:
[Export(typeof(IModule))]
public class Module : IModule
{
public Module() { }
[Import(typeof(IMainApp))]
public IMainApp Host { get; set; }
public void DoSomething()
{
Host.Config... // use config here
}
}