gpt4 book ai didi

c# - 从 usercontrol viewmodel 到 customUsercontrol Viewmodel 的 Unity 依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-03 10:54:44 32 4
gpt4 key购买 nike

我有一个 UserControl绑定(bind)到 viewmodel . viewmodel在构造函数中有参数,这是通过依赖注入(inject)完成的。到目前为止,依赖注入(inject)工作正常。

然后我有一个 CustomUserControl在我的 UserControl1View 中使用.
如何让依赖注入(inject)在我的 CustomUserControl 中工作?

我是依赖注入(inject)的新手,做了一些研究,但似乎无法让它工作。我收到一个错误

public partial class UserControl1View : UserControl, IView {
public UserControl1View( ) {
InitializeComponent( );
}
}

这是错误:
enter image description here

这是代码的示例。

用户控制 :
public partial class UserControl1View : UserControl, IView {
public UserControl1View( ) {
InitializeComponent( );
}
}

UserControlViewModel :
public class UserControl1ViewModel 
{
private readonly ISomeDataService dataService;
public UserControl1ViewModel (ISomeDataService dataservice, IUnityContainer container )
{
//Please note that the Dependency injection still works in this class, to much to explain the whole structure.
this.dataService = dataservice;
container.RegisterType( typeof( IView ), typeof( CustomUserControlView ) );
var view = container.Resolve<CustomUserControlView>( );
}

XAML :
<uc:CustomUserControlView/>

自定义用户控件 :
public partial class CustomUserControlView : UserControl, IView 
{
public CustomUserControlView(IUnityContainer container)
{
container.RegisterType( typeof( IViewModel ), typeof( CustomControlViewModel ) );
var viewModel = container.Resolve<CustomControlViewModel>( );
this.DataContext = viewModel;
InitializeComponent( );
}
}

CustomUserControlViewModel :
public partial class CustomUserControlViewModel : UserControl, IView 
{
private readonly ISomeDataService dataService;
public CustomUserControlViewModel(ISomeDataService dataservice)
{
var data = dataService.GetsomeCollection()
}
}

最佳答案

解决方法很简单。不要使用 DI/IoC 容器来注入(inject)控件。它不会起作用,也不应该起作用。

用户控件(与 View 相反)是独立的,可以与其他应用程序或不需要容器的 IDE 设计器一起工作。否则它们将无法与设计器很好地配合,因为 Xaml 设计器没有 DI/IoC 的概念,并且不知道如何解析/实例化某个类并且需要无参数构造函数。此外,“用户控件”不会将其逻辑拆分为 ViewModel。

另一边的 View 只是一个没有代码的 UI 模板。它也源自 WindowsUserControl类,但没有它自己的逻辑并且不可重用。 View 总是非常特定于特殊的 ViewModel,而 ViewModel 非常特定于 一个 应用。观看一 可以使用 DI,但仅注入(inject) ViewModel(即取决于您是采用 View-first 还是 ViewModel-first 方法)。

附带说明一下,您的 UserControl1ViewModel违反 MVVM,因为您的 VM 引用了您的 View ,这超出了 MVVM 的全部目的

关于c# - 从 usercontrol viewmodel 到 customUsercontrol Viewmodel 的 Unity 依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37206055/

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