gpt4 book ai didi

silverlight - 使用 MVVM、MEF 和 Silverlight4 将多个接口(interface)重构为通用接口(interface)

转载 作者:行者123 更新时间:2023-12-03 10:20:02 25 4
gpt4 key购买 nike

我只是在使用 MEF 学习 MVVM 并且已经看到了好处,但是我对一些实现细节有点困惑。我正在构建的应用程序有几个对不同实体执行相同操作的模型(WCF RIA 服务公开一个 Entity Framework 对象),我想避免为我需要的每个 View 实现类似的接口(interface)/模型,以下是我所拥有的想出虽然它目前不起作用。

公共(public)接口(interface)为实现基本模型的每个模型都有一个新的完成事件,这是我可以实现公共(public)类的最简单方法,因为编译器不喜欢从子类型转换为基本类型。

当前所在的代码可以编译并运行,但它是一个 null IModel,它被传递到 FaqViewModel 类的 [ImportingConstructor] 中。

我有一个如下定义的通用界面(为发布而简化),对于看过 Shawn Wildermuth 的 RIAXboxGames 示例的人来说,这应该看起来很熟悉。

public interface IModel
{
void GetItemsAsync();
event EventHandler<EntityResultsArgs<faq>> GetFaqsComplete;
}

实现接口(interface)的基本方法
public class ModelBase : IModel
{
public virtual void GetItemsAsync() { }
public virtual event EventHandler<EntityResultsArgs<faq>> GetFaqsComplete;
protected void PerformQuery<T>(EntityQuery<T> qry, EventHandler<EntityResultsArgs<T>> evt) where T : Entity
{
Context.Load(qry, r =>
{
if (evt == null) return;
try
{
if (r.HasError)
{
evt(this, new EntityResultsArgs<T>(r.Error));
}
else if (r.Entities.Count() > 0)
{
evt(this, new EntityResultsArgs<T>(r.Entities));
}
}
catch (Exception ex)
{
evt(this, new EntityResultsArgs<T>(ex));
}
}, null);
}

private DomainContext _domainContext;
protected DomainContext Context
{
get
{
if (_domainContext == null)
{
_domainContext = new DomainContext();
_domainContext.PropertyChanged += DomainContext_PropertyChanged;
}

return _domainContext;
}
}

void DomainContext_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
switch (e.PropertyName)
{
case "IsLoading":
AppMessages.IsBusyMessage.Send(_domainContext.IsLoading);
break;
case "IsSubmitting":
AppMessages.IsBusyMessage.Send(_domainContext.IsSubmitting);
break;
}
}
}

实现基本模型的模型
[Export(ViewModelTypes.FaqViewModel, typeof(IModel))]
public class FaqModel : ModelBase
{
public override void GetItemsAsync()
{
PerformQuery(Context.GetFaqsQuery(), GetFaqsComplete);
}

public override event EventHandler<EntityResultsArgs<faq>> GetFaqsComplete;
}

View 模型
[PartCreationPolicy(CreationPolicy.NonShared)]
[Export(ViewModelTypes.FaqViewModel)]
public class FaqViewModel : MyViewModelBase
{
private readonly IModel _model;

[ImportingConstructor]
public FaqViewModel(IModel model)
{
_model = model;
_model.GetFaqsComplete += Model_GetFaqsComplete;

_model.GetItemsAsync(); // Load FAQS on creation
}

private IEnumerable<faq> _faqs;
public IEnumerable<faq> Faqs
{
get { return _faqs; }
private set
{
if (value == _faqs) return;

_faqs = value;
RaisePropertyChanged("Faqs");
}
}

private faq _currentFaq;
public faq CurrentFaq
{
get { return _currentFaq; }
set
{
if (value == _currentFaq) return;

_currentFaq = value;
RaisePropertyChanged("CurrentFaq");
}
}

public void GetFaqsAsync()
{
_model.GetItemsAsync();
}

void Model_GetFaqsComplete(object sender, EntityResultsArgs<faq> e)
{
if (e.Error != null)
{
ErrorMessage = e.Error.Message;
}
else
{
Faqs = e.Results;
}
}
}

最后是 Silverlight View 本身
public partial class FrequentlyAskedQuestions
{
public FrequentlyAskedQuestions()
{
InitializeComponent();
if (!ViewModelBase.IsInDesignModeStatic)
{
// Use MEF To load the View Model
CompositionInitializer.SatisfyImports(this);
}
}

[Import(ViewModelTypes.FaqViewModel)]
public object ViewModel
{
set
{
DataContext = value;
}
}
}

最佳答案

似乎我在尝试重构为多个模型时走错了路。如此处所示,http://msdn.microsoft.com/en-us/magazine/dd458800.aspx#id0090019如果看起来最好的做法是将模型视为通过 RIA 服务引用的 EDMX 类的实例。因此,模型应该包含访问 DomainContext 所需的所有方法和事件处理程序。

如果有人有其他想法,我会向他们敞开心扉。

关于silverlight - 使用 MVVM、MEF 和 Silverlight4 将多个接口(interface)重构为通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2518723/

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