0

我正在编写一些 asp.net 自定义服务器控件,并寻找有关如何注入控件所需的依赖项的最佳实践。

在决定如何做到这一点时,我考虑了几个因素:

1)通过标记注入这种依赖关系有多容易。
2)通过代码隐藏注入这种依赖关系有多容易。
3) 此注入必须在控件生命周期中尽早进行,最好控件应在 OnInit() 中提供其所有依赖项。

基于这些因素,我能想到的唯一方法是在控件上有一个字符串属性,该属性将具有依赖项的完全质量类型。一旦控件初始化,它就可以加载该类型并执行它需要执行的操作。

示例

public class MyControl : CompositeControl
{     

     public string RepositoryType { get; set; }     
     protected IRepository Repository { get; set; }

     protected override void OnInit()
     {
          EnsureChildControls();
     }

     protected override void CreateChildControls()
     {
          if (!ChildControlsCreated)
          {
              Repository = ComponentFactory.Instanciate(RepositoryType);
          }
     }
}

我一直遇到这种情况,想知道是否有人想出另一个/更好/不同来注入依赖项。
谢谢 :)

4

1 回答 1

1

我所做的是在控件的 init 上,查询 DI 容器并填充这些引用。您可以将此逻辑嵌套在自定义服务器控件可以继承的专用基类中,以便重用它。或者:每次将控件添加到控件树时,都会调用一个特殊的AdditionalControl方法。这里需要注意的是,它可能只调用父控件上的方法,而不会向上传播。它可能会根据您的情况起作用。

生命周期中没有太多内容可以让您知道何时创建控件(除了 AdditionalControl 方法或在流程开始时运行的 Init 方法)以便能够利用,并且您无法自定义控件的构造函数。

关于#1,使用标记方法需要利用控件的设计时方面,并充分利用设计时属性。但是#1 意味着在标记中定义映射,这并不是 DI 容器的重点。设计器仍然需要属性或其他东西来分配引用,所以它本质上是定义属性的双重工作,然后在设计器中定义一些东西,当 DI 容器为您处理这些时。

于 2013-09-20T15:30:37.070 回答