在開發允許編輯文章和載體(托盤,貨架)數據(以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