使用EventAggregator(或其他东西 - 可能是IoC)和MEF

时间:2010-12-14 01:31:44

标签: c# events mef messaging eventaggregator

我目前正在建立一个MEF项目,以便我可以学习如何在实际应用中使用它。我已成功导入DataHandler模​​块以提供数据库连接和其他集中式数据库操作。

现在我正在考虑为其他导入模块提供方法的方法。例如,如果安全模块需要连接到数据库,则它可以请求数据库连接。现在,我有一种模块可以检测DataHandler是否可用,因为Host应用程序将其公开。所以我想知道是否有办法使用EventAggregator发布一种事件,其中订阅者(安全模块)只是触发一个事件并获得一个DbConnection对象作为回报。

如果EventAggregator是答案,我可以使用一些提示。请记住,我仍在研究......不只是要求 teh codez 。如果有更好的解决方案,我对选项感兴趣。

我目前正在Denis Vuyka

审核这篇文章

修改

EventAggregator看起来可能不是正确的工具。我可以在我的主机应用程序中实现某种松散耦合的消息传递吗?服务定位器或命令模式是否可以实现?

2 个答案:

答案 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
    }
}