在开发允许编辑文章和载体(托盘,货架)数据(以CRUD方式)的WPF应用程序中,我正在寻找如何管理WPF应用程序的生命周期WCF客户端连接到包含实际数据的服务。如何在WPF应用程序中管理WCF客户端的生命周期
我更喜欢使用使用Caliburn Micro和StructureMap或Castle Windsor的MVVM方法。
我的主要问题不是创建WCF客户端渠道或工厂,而是更重要的是使用后的清理。我打算在服务器端使用per-request生命周期,因此我需要根据每个请求创建和处理我的客户端。这样我心里有以下几点:
public class Article
{
public int Id { get; set; }
public string ArticleId { get; set; }
}
[ServiceContract]
public interface IArticleCrud
{
[OperationContract]
Article CreateArticle(string articleId);
[OperationContract]
void Delete(int articleId);
}
public class ArticlesViewModel
{
private readonly Func<IArticleCrud> articleCrudFactory;
public ArticlesViewModel(Func<IArticleCrud> articleCrudFactory)
{
this.articleCrudFactory = articleCrudFactory;
}
public void Delete(int articleId)
{
// Doesn't work since IArticleCrud is not IDisposable
using (var crud = articleCrudFactory())
{
crud.Delete(articleId);
}
}
}
正如评论,这将无法工作,因为IArticleCrud不是IDisposable的注意。 IArticleCrud用于在客户端创建ChannelFactory,为实现相同接口的服务生成代理。我会高兴地换出这个代码如下:
public class DeleteArticleCommand : IRequest
{
public int Id { get; set; }
}
public class ArticlesViewModel
{
private readonly IMediator mediator;
public ArticlesViewModel(IMediator mediator)
{
this.mediator = mediator;
}
public void Delete(int articleId)
{
mediator.Send(new DeleteArticleCommand {Id = articleId});
}
}
public class DeleteArticleCommandHandler : RequestHandler<DeleteArticleCommand>
{
private readonly IArticleCrud articleCrud;
public DeleteArticleCommandHandler(IArticleCrud articleCrud)
{
this.articleCrud = articleCrud;
}
protected override void HandleCore(DeleteArticleCommand message)
{
articleCrud.Delete(message.Id);
}
}
但是,因为我还没有处理处置WCF客户端这并没有解决我的问题。然而,我可以让IMediator在发送操作上创建一个新的嵌套容器,并在发送操作完成后将其放置,但它似乎很麻烦。
我是否弄错了所有的错误,还是仅仅需要付出很大的努力才能从WPF应用程序执行WCF调用?
作为一个旁注,我将拥有比这些少数几个CRUD服务更多的服务,所以在我的CRUD服务中解决这个问题的可能实用的解决方案不是一种选择。
讲述的是WCF会话寿命这个问题? – Jasper
不,我想通过会话PerRequest保持WCF层尽可能薄。 – mycroes