【问题标题】:Using EventAggregator (or something else - IoC maybe) with MEF将 EventAggregator(或其他东西 - 也许是 IoC)与 MEF 一起使用
【发布时间】:2010-12-15 05:59:39
【问题描述】:

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

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

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

我目前正在审核Denis Vuyka的这篇文章

编辑

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

【问题讨论】:

    标签: c# events mef messaging eventaggregator


    【解决方案1】:

    听起来您正在寻找服务定位器,而不是 EventAggregator。

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

    【讨论】:

    • @Wim:好的,我明白你在说什么。我的主机是[Import]ing Lazy<IDataHandler DataHandler {get; set; }。那么,真的像将ISecurityHandler 合约编码 以获得DataHandler.DbConnection 对象那么简单吗?
    • @dboarman:如果我正确理解了你的例子,那么我的第一个想法是导入一个IDbConnectionFactory 对象,然后在我需要打开一个新的数据库连接时调用IDbConnectionFactory.Create()。跨度>
    • Wim,是的,IDbConnectionFactory.Create() 很好;然而,在没有任何消息的情况下,只有主机应用程序知道 DataHandler。我希望其他模块将该请求直接传递给 DataHandler。
    • @dboarman:那么您还需要在这些模块中注入/导入 DataHandler。
    • @Wim:似乎将 DataHandler 导入其他模块效率低下。当每个模块导入 DataHandler 时,每个模块实际上都会实例化它自己的 DataHandler。这不需要发生,因为 DataHandler 被编写为根据请求提供新的 DbConnection。您提到了一个 ServiceLocator - 这不是 IoC 之类的东西吗?
    【解决方案2】:

    我通过导出主应用程序界面将我的配置传递给所有模块。您可以在主应用程序中托管您的数据库接口的单个​​实例。

    主机应用程序导出它自己,所有插件都导入它并可以访问它的界面。请参阅下面的示例:

    界面:

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

    【讨论】:

    • 啊哈(我希望你能看到我脑袋里的灯亮着)
    • 今晚测试...将提供进一步的反馈。
    • 我想我在构图的发生方式上遗漏了一些东西。仍在努力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 2020-02-27
    • 2018-06-13
    相关资源
    最近更新 更多