1

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

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

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

我目前正在查看Denis Vuyka的这篇文章

编辑

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

4

2 回答 2

2

听起来您正在寻找Service Locator,而不是 EventAggregator。

但是,如果您已经使用 MEF 注入了这些服务,为什么还要通过服务定位器请求服务呢?如果您需要稍后在运行时获取服务,您可以注入一个Lazy<T>或一个工厂来代替。

于 2010-12-14T02:18:46.547 回答
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
    }
}
于 2010-12-14T21:59:39.880 回答