没有Unity

时间:2016-06-09 14:17:59

标签: c# asp.net asp.net-mvc asp.net-web-api

我有一个问题,我不知道如何解决。我有一个容器,其中包含我使用WebApi公开的不同服务的不同接口。问题是我需要在我的控制器中获取依赖项,我必须避免使用静态。我读到了这个

http://beletsky.net/2011/10/inside-aspnet-mvc-idependencyresolver.html

http://www.asp.net/web-api/overview/advanced/dependency-injection

在asp.net中,我读到我可以实现自己的IDependencyResolver。这是疯了吗?因为我搜索了很多,我只找到了使用Unity的例子。如果我不想使用该依赖注入器?它实现这一目标的最佳途径是什么?。

public class MyController: ApiController
{
    private InterfaceService m_interfaceService; //This is the dependency I need

    public MyController()
    {

    }

    [HttpGet]
    [Route("myServices/")]
    public List<IServiceCategory> GetServiceObjectsList()
    {
        return m_interfaceServices.GetObjectsList();
    }

}

3 个答案:

答案 0 :(得分:1)

所以你有一个预先存在的容器/依赖机制!你应该问你的团队为什么做出类似的东西是个好主意,而不是在.net世界中使用所有好的东西。

尽管如此,来自文档:

http://www.asp.net/web-api/overview/advanced/dependency-injection

  

虽然您可以编写完整的IDependencyResolver实现   从头开始,界面真的被设计成充当桥梁   在Web API和现有的IoC容器之间。

该页面上的Unity示例显示了为弥合Unity DI框架和Web mvc之间的差距必须采取的措施。你只需要用自制卷轴做同样的事情。实现几个方法的问题。去吧!

答案 1 :(得分:1)

以下是符合您要求的实施方案:

namespace AdvancedDI.Controllers
{
    public class ProductController : ApiController
    {
        public IFactory iFactory { get; set; }

        protected override void Initialize(HttpControllerContext controllerContext)
        {
            DIAPP.GetContainer(this);
            base.Initialize(controllerContext);
        }

        public IHttpActionResult Get()
        {
            var response = iFactory.DoWork();
            return Ok(response);
        }

        protected override void Dispose(bool disposing)
        {
            DIAPP.Dispose(this);
            base.Dispose(disposing);
        }
    }
}

这是一种基于财产的注射。可以使用UnityContainerExtensions。在Initialize之前将调用Get方法。

第1步。DIAPP.GetContainer(this)包含整个productController上下文。

第2步。GetContainer从中收到IFactory属性信息。

第3步。接下来,您有机会收到此IBuilderContext的统一IFactory

答案 2 :(得分:0)

我已经使用Ninject和AutoFac进行依赖注入。这不是疯狂,这是常见的做法。