2

我有 5 个模块,我正在使用EventAggregator模式在模块之间进行通信。在我看来,我的代码变得丑陋,在我的项目中使用EventAggregator是糟糕的设计。

模块间通信的三种方式:

  • 松耦合事件
  • 共享服务
  • 共享资源

我想了解更多关于共享服务通信的信息。我发现了一篇关于Prism ToolKit 中的 StockTrader 应用程序的文章。

是否有一些在 Prism 中使用共享服务的更轻量级和更清晰的示例,可以看到使用共享服务的模块之间的对话?(可下载的代码将不胜感激)

4

2 回答 2

4

您的代码以哪种方式变得丑陋?如果您愿意,这EventAggregator是一项共享服务。

您将服务接口放在共享程序集中,然后一个模块可以将数据推送到服务中,而另一个模块从服务中获取数据。

编辑:

共享装配

public interface IMySharedService
{
    void AddData( object newData );
    object GetData();
    event System.Action<object> DataArrived;
}

第一个通信模块

// this class has to be resolved from the unity container, perhaps via AutoWireViewModel
internal class SomeClass
{
    public SomeClass( IMySharedService sharedService )
    {
        _sharedService = sharedService;
    }

    public void PerformImport( IEnumerable data )
    {
        foreach (var item in data)
            _sharedService.AddData( item );
    }

    private readonly IMySharedService _sharedService;
}

第二通信模块

// this class has to be resolved from the same unity container as SomeClass (see above)
internal class SomeOtherClass
{
    public SomeOtherClass( IMySharedService sharedService )
    {
        _sharedService = sharedService;
        _sharedService.DataArrived += OnNewData;
    }

    public void ProcessData()
    {
        var item = _sharedService.GetData();
        if (item == null)
            return;

        // Do something with the item...
    }

    private readonly IMySharedService _sharedService;
    private void OnNewData( object item )
    {
        // Do something with the item...
    }
}

其他一些模块的初始化

// this provides the instance of the shared service that will be injected in SomeClass and SomeOtherClass
_unityContainer.RegisterType<IMySharedService,MySharedServiceImplementation>( new ContainerControlledLifetimeManager() );
于 2016-01-12T15:02:53.760 回答
1

GitHub 上的 Prism 库 repo 包含 Stock Trader 示例应用程序的最新版本,其中包括服务示例和源代码,供您查看和下载。

https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/StockTraderRI

于 2016-01-12T12:27:37.317 回答