gpt4 book ai didi

c# - 如何重构对服务层的 RIA 数据服务调用?

转载 作者:太空宇宙 更新时间:2023-11-03 11:32:43 24 4
gpt4 key购买 nike

我在使用 RIA 服务和实体的 Silverlight 4 应用程序中遇到一些基本的 MVVM 设计原则。这是似乎工作正常的基本场景:

DataViewModel.cs

public DataViewModel : NotificationObject

private DataDomainContext _dataContext;

public DataViewModel()
{
_dataContext = new DataDomainContext();

if (!DesignerProperties.IsInDesignTool)
{
Data = _dataContext.Data;
dataContext.Load(_dataContext.GetDataQuery(), null, null);
}
}

private IEnumerable<DataEntity> _data;
public IEnumerable<DataEntity> Data // INPC property
{
get { return _data; }
set
{
if (value != _data)
{
_data = value;
PropertyChanged(this, new PropertyChangedEventArgs("Data"));
}
}
}
}

在我看来,DataGrid 单向绑定(bind)到 DataViewModel.Data,而 DataDomainContext 是在为 DataEntity 对象编译域服务后公开的 RIA 域上下文。

我想将 View 模型与 DAL 分离。我想要一个 DataService 类,它负责向域上下文询问数据:

public DataViewModel : NotificationObject

private DataService _dataService;

public DataViewModel(DataService dataService)
{
_dataService = dataService;

if (!DesignerProperties.IsInDesignTool)
{
Data = _dataService.Data;
_dataService.GetData();
}
}

...
}

但是,我似乎做对了。这很容易做到吗?我以前没有设计过带有回调的数据服务。我尝试通过 INPC 跨三个类链接 Data 属性,但 UI 中的 DataGrid 显示为空白。我还想转换为新类型 DataDto 的集合,这样我的表示层就不会耦合到后端。我没有运气就尝试过这样的事情:

DataService.cs

public DataService : INotifyPropertyChanged
{
public DataService()
{
_dataContext = new DataDomainContext();
}

public event PropertyChangedEventHandler PropertyChanged;

public void GetData()
{
DataEntities = _domainContext.Data;
_dataContext.Load(_dataContext.GetDataQuery(), FinishedLoading, null);
}

private void FinishedLoading(...)
{
Data = DataEntities.Select(de => new DataDto(de));
}

public IEnumerable<DataDto> Data { ... } // INPC property, used for binding in ViewModel

public IEnumerable<DataEntity> DataEntities { ... } // INPC property

...
}

我是否走在正确的轨道上?我是否遗漏了高层次的任何东西,或者我只是没有正确的细节?

编辑:

我最终弄明白了这一点。答案涉及通过 Action<> 将回调传递到数据服务/存储库调用中。调用的返回类型实际上是 void,事件参数用于传递结果。如果有人感兴趣,我很乐意发布一些工作代码,只需在评论中提出请求即可。

最佳答案

我认为您走在正确的轨道上,但在我看来如果您实际上试图将 View 模型与数据服务分离,那么您的解决方案就不正确。我现在正在开发一个与此非常相似的应用程序。不同的人对 mvvm 有不同的看法,这只是我从反复试验中学到的个人方法(使用 visual studio):

首先创建 silverlight 应用程序项目并将其托管在 .web 项目中。silverlight 项目将保存 View 和 View 模型。 View 模型应该包含您的模型,而不是您的数据服务!但是, View 模型应该有一个数据服务实例来设置模型。我的数据服务在哪里?我很高兴你问 :)。添加另一个项目,一个 WCF RIA 服务类库。那实际上是两个项目,一个 ria 服务(服务器端)dll 和一个相应的 silverlight(客户端)dll。您可以将您的 Entity Framework 或其他数据库访问代码添加到服务器端。之后,将域服务添加到服务器端项目。首先构建它(重要),然后转到客户端 ria 服务 dll 并使用您的数据服务方法创建数据服务类,如下所示:

public void GetData( string filter, Action<LoadOperation<MyEntityType>> callback )
{
var q = from e in _context.GetDataQuery()
where e.SomeField.Contains(filter)
select e;
_context.Load(q, LoadBehavior.RefreshCurrent, callback, null);
}

你的数据服务不应该实现 Inotifyproperty changed 因为那是 View 模型的角色!在您的 silverlight 项目中引用 ria 服务客户端 dll,并在您的 web 主机项目中引用 ria 服务服务器端 dll View 模型应该像这样调用这个数据服务:

IEnumerable<MyEnityType> Model {get;set;}
//NOTE: add notify property changed in setter!

private void GetData()
{
_myDataService.GetData( _filter, loadOperation =>
{
if ( loadOperation.HasError )
HandleError(loadOperation.Error);
Model = loadOperation.Entities;
} );
}

如果你真的想解耦它们,你可以更进一步,为数据服务实现一个接口(interface)。采用这种方法可以重用您的数据服务(如果您需要桌面应用程序或手机应用程序),我希望这有助于解决问题!

关于c# - 如何重构对服务层的 RIA 数据服务调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7233571/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com