【问题标题】:Access container outside of constructor在构造函数之外访问容器
【发布时间】: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


【解决方案1】:

ServiceLocator.Current.GetInstance 可以在任何地方为您提供任何依赖项。

但要小心,因为依赖关系几乎是隐藏的。

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 2020-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2018-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多