【问题标题】:Injecting WCF service proxy into viewmodel将 WCF 服务代理注入视图模型
【发布时间】:2012-09-12 16:11:59
【问题描述】:

我目前有一个使用 Prism 和 MEF 的 Silverlight 应用程序。我在此应用程序中连接到多个 WCF 服务,但使用“控制器”类来保存实例化的客户端生成的服务代理对象。

我想要做的是将服务引用注入这个控制器(就像我目前对 IEventAggregator 所做的那样)。我不确定该怎么做。我是否需要创建一个实现服务合同接口的包装类,并持有对服务代理对象的引用?

我现在做什么:

/// <summary>
/// WCF client used to communitcate with the data WCF service
/// </summary>
private DataClient _dataClient;  // DataClient is the client generated object from a service reference

/// <summary>
/// Region manager for the application
/// </summary>
private IRegionManager _manager;

/// <summary>
/// Application event aggregator
/// </summary>
private IEventAggregator _eventAggregator;

/// <summary>
/// Constructor. Initializes the statistics controller, hooks up all services, and initializes all commands.
/// </summary>
/// <param name="manager"></param>
[ImportingConstructor]
public ZOpportunityController(IRegionManager manager, IEventAggregator events)
{
    _manager = manager;
    _eventAggregator = events;

    //hookup a WCF service used to retrive GP data
    _dataClient = new ZellerGpDataClient();  
    _dataClient.OpenCompleted += new EventHandler<AsyncCompletedEventArgs>(_dataClient_openCompleted);
    _dataClient.GetCustomersCompleted += new EventHandler<GetCustomersCompletedEventArgs>(_dataClient_GetCustomersCompleted);
    _dataClient.OpenAsync();
}

正如您在此处看到的,我在控制器构造函数中连接到服务,但我只想将服务对象注入控制器,就像使用 IRegionManager 和 IEventAggregator 一样。

编辑: This blog post 确实是我想要完成的。

【问题讨论】:

    标签: wcf silverlight silverlight-4.0 dependency-injection prism-4


    【解决方案1】:

    ClientBase&lt;TChannel&gt; 派生一个客户端并使其执行您的服务合同。合约的实现类似于这样:

    public class MyClient : ClientBase<IMyService>, IMyService
    {
      void IMyService.DoSomething(Foo bar)
      {
        this.Channel.DoSomething(bar);
      }
    }
    

    现在您可以使用 MEF 或任何其他容器注册该实现并通过构造函数注入它。

    【讨论】:

    • 感谢您的快速回复。 “IMyService”将是服务引用创建的接口,对吗?此外,由于这是 Silverlight (服务调用是异步的),使用您的示例,“MyClient”是否也可以连接到异步完成的事件?我在想,如果是这种情况,我需要将事件暴露给使用服务注入的对象吗?
    • @Ryan 对不起,我忽略了你正在使用生成的东西。那么你应该已经有了上面的代码。添加服务参考会为您生成类似的内容。如果您使用生成的代码,您还将免费获得这些事件。
    • OK...那么,使用我的代码中的示例和您的类名,“MyClient”是否会在其中包含一个“DataClient”对象?如果是这样,注入是如何工作的……我可以注入具体的类吗?我的印象是我必须注入接口。
    • @Ryan 除非 MEF 有一些限制,否则我不知道您可以在构造函数中导入任何内容(接口、具体类、原语)。接口将允许您将一种实现交换为另一种实现,而无需更改控制器。但是你也可以注入一个DataClient 对象。
    • 这是我尝试做的一个很好的例子。但你的回答是我收到的唯一一个,它仍然很有帮助。 blogs.southworks.net/gmaliandi/2011/10/…
    猜你喜欢
    • 2011-10-23
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 2023-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 1970-01-01
    相关资源
    最近更新 更多