【发布时间】:2016-02-29 15:36:34
【问题描述】:
使用 Unity,我可以通过构造函数注入各种控件/接口,如下所示:
private readonly IEmployeeRepository _employeeRepository;
public EmployeeView_EmployeeListViewModel(IEmployeeRepository employeeRepository)
{
_employeeRepository = employeeRepository;
}
但是,我需要访问构造函数之外的特定控件(比如说示例中使用的控件)(我无法编辑构造函数)。
有没有办法,怎么办?
编辑 更多信息 - 我有一个 DataForm,它允许用户在他们的 DataGrid(简单编辑表单)上执行简单的 CRUD 操作。该控件来自 Telerik inc.,因此它的命令类如下所示:
public class CustomDataFormCommandProvider : DataFormCommandProvider
{
public CustomDataFormCommandProvider():base(null)
{
}
protected override void MoveCurrentToNext()
{
if (this.DataForm != null)
{
this.DataForm.MoveCurrentToNext();
this.DataForm.BeginEdit();
}
}
protected override void MoveCurrentToPrevious()
{
if (this.DataForm != null)
{
this.DataForm.MoveCurrentToPrevious();
this.DataForm.BeginEdit();
}
}
protected override void CommitEdit()
{
if (this.DataForm != null && this.DataForm.ValidateItem())
{
this.DataForm.CommitEdit();
}
}
protected override void CancelEdit()
{
if (this.DataForm != null)
{
this.DataForm.CancelEdit();
}
}
}
如果我以任何方式更改构造函数,命令将停止工作(因此我无法将我的接口放入构造函数中)。
我需要做的是在CommitEdit 下,除了更新用户控件,我还想做一个单独的调用,它将特定用户的更改保存在数据库下(我的IEmployeeRepository 负责所有)。
这就是为什么我需要找到一种方法,如何以这种“正确”的方式实现它。我当然可以重新设置此控件的模板样式并重新绑定 OK 和 Cancel 按钮,但我不相信这是要走的路。
最终
ServiceLocator 完成了这项工作。代码如下:
_employeeRepository = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<IEmployeeRepository>();
【问题讨论】:
-
您可以在课堂上的任何地方访问
_employeeRepository。或者你想要一个依赖注入,但不是通过构造函数?那时你可以进行二传手注入。在属性上使用[Dependency]使其在解析时注入。 -
我所做的是,我有一个用于我的数据表单的命令提供程序(带有我无法更改的预定义构造函数)并且当单击提交按钮时,我需要将参数传递给特定的控制(我需要调用命令)
-
能否将按钮绑定到特定控件上的命令?我想我不完全理解你想要做什么以及这里有什么问题。你能在原始问题中添加更多代码吗?
-
CustomDataFormCommandProvider是如何创建的?如果它是从你的统一容器中解析的,你可以在构造函数中注入对IEmployeeRepository的依赖。如果没有,您可以使用ServiceLocator直接在CommitEdit中解决它。 -
你是明星! ServiceLocator 完成了这项工作。请给出答案。
标签: c# wpf mvvm inversion-of-control unity-container