【问题标题】:Dependency Injection in a ASP.NET Custom Server ControlASP.NET 自定义服务器控件中的依赖注入
【发布时间】:2013-09-20 15:16:37
【问题描述】:

我正在编写一些 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);
          }
     }
}

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

【问题讨论】:

  • 您是否查看过任何依赖注入框架,例如 Unity 或 NInject?这些将根据您的配置方式在运行时自动为您注入一个具体的类。
  • 目前,我宁愿不要在系统中添加另一个变量(框架)。也许将来我会检查出来。
  • 这取决于您如何实例化控件。如果它是通过代码隐藏动态加载的,那么如果您让服务器通过 asp 标记加载它(其中一个您拥有实例,另一个在幕后),则依赖注入的工作方式会有所不同。如果通过 asp 标签加载,在某些框架中,您可以将[Inject] 之类的属性应用于属性,以告诉您的注入器要填充哪些依赖项。
  • @BlueChameleon 我理解这个逻辑,但你基本上是在重新创建轮子。特别是 NInject 是一个非常轻量级的 DI 框架,它比您设计的“只是为了让它工作”的东西经过更好的测试和更健壮。您将自学一个新工具,该工具将在未来的项目中有用,并避免您自定义编写的 DI 系统产生的任何错误。我不是说你不是一个有能力的开发者,而是当你有机会时,站在巨人的肩膀上。

标签: c# asp.net dependency-injection custom-server-controls


【解决方案1】:

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

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

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

【讨论】:

  • 如果我理解正确,您的解决方案没有考虑如何从标记中设置 DI。
  • 确实如此。以上编辑。
  • 您对标记是正确的。从标记中分配依赖项是没有意义的。我想 DI 的全部内容是,我总是在自容器和可消耗的组件之间纠结。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 2020-09-15
相关资源
最近更新 更多