【发布时间】:2013-04-29 23:38:09
【问题描述】:
目前我正在尝试使用依赖注入容器,这次是使用 Unity。
给定如下界面:
public interface IPodcastCommService
{
void Download();
void Upload();
}
以及以下实现:
public class PodcastService
{
private IPodcastCommService commservice;
private String url;
public PodcastService(String url, IPodcastCommService commservice)
{
this.commservice = commservice;
this.url = url;
}
}
因为构造函数的关系,一直在找办法传参数给它,结果找到了:
var p = container.Resolve<IPodcastCommService>(new ParameterOverride("url", myUrl));
到目前为止一切都很好,但同时我读到这有多糟糕以及类的设计有多糟糕,是的,它看起来有点难看。但是如何以优雅的方式将参数传递给类?
我的第一个想法是把它作为一个属性来做,但是每次我需要它已经给出的 URL 时我都必须检查它。
更新: 一个例子,我读到这是一个糟糕的设计,是这样的:
但在某些情况下,您可能会为解析操作传入自定义构造函数参数。有些人可能会争辩说,这是糟糕架构的尖叫声,但在某些情况下,例如将 DI 容器引入遗留系统可能需要这些操作。
来源:http://mikaelkoskinen.net/unity-passing-constructor-parameters-to-resolve/
【问题讨论】:
-
你介意告诉我你在哪里有红色这是糟糕的设计吗?因为我实际上认为这个设计是你能得到的最好的。
-
@Egi:我用来源更新了我的问题。
-
您可以使用ServiceLocator 进行DI,而无需在构造函数中列出注入的属性。