【发布时间】:2014-12-03 10:35:51
【问题描述】:
我确信这里有我的问题的答案,虽然我只是不太明白我在寻找什么或我正在阅读什么......另外,不是 100% 肯定 DI 是我应该做的在这种情况下使用。
我正在尝试将 Unity 用于我的 DI。我正在将依赖项注入 ASP.Net Web API 控制器。到目前为止一切顺利。
我将控制器需要的服务注入到我的控制器中。例如,在我的一个控制器中,我有:
private TransactionService _transactionService;
public TransactionsController(TransactionService transactionService)
{
_transactionService = transactionService;
}
在这种情况下,我将 TransactionService 的一个实例注入到控制器中。这一切正常。
我的 WebApiConfig.cs 包含以下内容,据我了解,它实际上执行了注入:
var container = new UnityContainer();
container.RegisterType<ServiceBase>(new HierarchicalLifetimeManager());
config.DependencyResolver = new UnityResolver(container);
如果需要,我可以告诉你我的UnityResolver。
现在我正在努力的部分......
我的服务都继承自抽象类 ServiceBase - 最简单的形式如下:
public abstract class ServiceBase : IDisposable
{
internal Account _account;
public ServiceBase(){}
}
我想做的是在我的注入过程中创建Account 并以某种方式传递它,这样我注入的服务就不需要处理实例化帐户。
当我尝试将任何构造函数添加到我的服务以接受帐户时,我会收到消息以确保我的控制器具有无参数构造函数。
那么.. 我如何设置我的 DI 以便我可以将服务注入到我的控制器中,并将一个预先实例化的 Account 实例注入到我的服务中?
更新
我忘了提(抱歉 Wiktor)——如果可能的话,我不想使用属性。在我看来很奇怪,我们可以使用 DI 来解开依赖关系,然后到处放一堆依赖属性。我很可能只是没有正确理解 DI 概念,尽管这对我来说似乎不正确
【问题讨论】:
-
在使用 DI 时使用接口,因为它在单元测试时非常容易。在我的项目中,我最喜欢接口,因此它不会紧密耦合。此外,在进行 DI 时,只需了解松散耦合的概念并牢记单元测试。
-
您能否清楚地解释一下您在 DI 期间尝试使用帐户属性做什么?
-
解释我正在尝试什么有点困难,因为我不知道我应该尝试什么 - 因此在这里问。我已经解释了我想要实现的目标,即我想实例化我的帐户对象并将其注入到任何其他需要它的类中——而不是让 Unity 为我实例化帐户对象。
-
另外 - 我如何针对接口编写统一配置,因为它们不允许构造函数?也许您可以发布有关如何执行此操作的答案?
-
同意您对属性的更新。
标签: c# asp.net dependency-injection