【发布时间】: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