DevExpress Universal Subscription
DevExpress WinForms Subscription
DevExpress VCL Controls
DevExtreme跨平台开发框架
.NET开发框架eXpressApp Framework(XAF)
DevExpress学院
中文文档库
MyDataService dataService;
public UserViewModel() {
this.dataService = new MyDataService();
类紧密相连,每次使用 UserViewModel 时,它都会隐式创建 MyDataService 的一个实例。
如果以后修改 MyDataService 的初始化方式,则必须修改 MyDataService 初始化的所有视图模型。
您不能专门为 UserViewModel 类创建单元测试,因为它依赖于 MyDataService。 如果测试失败,您可能无法确定错误是在 UserViewModel 中还是在 MyDataService 中。
MyDataService dataService;
public UserViewModel(MyDataService dataService) {
this.dataService = dataService;
IDataService dataService;
public MainViewModel(IDataService dataService) {
this.dataService = dataService;
protected override void OnStartup(StartupEventArgs e) {
base.OnStartup(e);
var builder = new ContainerBuilder();
//allow the Autofac container resolve unknown types
builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
//register the MyDataService class as the IDataService interface in the DI container
builder.RegisterType<MyDataService>().As<IDataService>().SingleInstance();
IContainer container = builder.Build();
//get a MainViewModel instance
MainViewModel mainViewModel = container.Resolve<MainViewModel>();
public MainView() {
InitializeComponent();
this.DataContext = container.Resolve<MainViewModel>();
public class DISource : MarkupExtension
public static Func<Type, object> Resolver { get; set; }
public Type Type { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider) => Resolver?.Invoke(Type);
<UserControl DataContext="{local:DISource Type=local:MainViewModel}">
public partial class App : Application
protected override void OnStartup(StartupEventArgs e) {
base.OnStartup(e);
//...
IContainer container = builder.Build();
DISource.Resolver = (type) => {
return container.Resolve(type);
public INavigationService NavigationService { get; }
public MainViewModel(INavigationService navigationService) =>
NavigationService = navigationService;
<dxwui:NavigationFrame>
<dxmvvm:Interaction.Behaviors>
<common:AttachServiceBehavior Service="{Binding NavigationService}"/>
</dxmvvm:Interaction.Behaviors>
</dxwui:NavigationFrame>
AttachServiceBehavior 是一个简单的附加操作,它在服务属性更改时调用 NavigationFrameService.Attach。 虽然 AttachServiceBehavior 不包含在我们的库中,但您可以在此处获取其代码:How to use our Services with Dependency Injection/AttachServiceBehavior。即使 MainViewModel 使用 NavigationFrameService,它也不必实现 ISupportServices 接口。 此外,导航中涉及的所有子视图都可以在不附加到 NavigationFrame 的情况下使用该服务——因为它已经在主视图级别进行了配置。
本站文章除注明转载外,均为本站原创或翻译
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果
转载请注明:文章转载自:DevExpress控件中文网 [https://www.devexpresscn.com/]
本文地址:https://www.devexpresscn.com/post/3082.html
相关产品:
DevExpress Universal Subscription,