使用Ninject的项目依赖项

时间:2014-08-20 13:23:07

标签: c# asp.net-mvc asp.net-mvc-4 dependency-injection ninject

继续我在依赖注入方面的研究,我对某些项目与其依赖项之间的关系有一些疑问。

enter image description here

我在App_Start文件夹

中创建了IocConfig类

IocConfig类

public class IocConfig
{
    public static void ConfigurarDependencias()
    {
        IKernel kernel = new StandardKernel();

        kernel.Bind<IReceitaRepository>().To<SqlReceitaRepository>();

        DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
    }
}

public class NinjectDependencyResolver : IDependencyResolver 
{
    private readonly IResolutionRoot _resolutionRoot;

    public NinjectDependencyResolver(IResolutionRoot kernel) 
    {
        _resolutionRoot = kernel;
    }

    public object GetService(Type serviceType)
    {
        return _resolutionRoot.TryGet(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return _resolutionRoot.GetAll(serviceType);
    }
}

但请看下面的一行

kernel.Bind<IReceitaRepository>().To<SqlReceitaRepository>();

我无法引用SqlReceitaRepository,因为此类位于我的数据访问层中,而App_Start文件夹和IocConfig位于表示层之下。

IReceitaRepository位于我的Interface project域名下,实施位于数据访问层下的SqlReceitaRepository类。

我做错了什么? 在我的构思中,我没有必要在我的Presention Layer上引用数据访问层。

Home Controller构造函数

    private readonly IReceitaRepository repositorio;

    public HomeController(IReceitaRepository repositorio)
    {
        if (repositorio == null)
            throw new ArgumentException("repositorio");

        this.repositorio = repositorio;
    }

1 个答案:

答案 0 :(得分:3)

这取决于,如果您希望应用程序中的单个点注册所有服务,这是可以接受的。您可以做的其他事情是向应用程序添加API层,域和数据访问将使用该层。该层将包含所有服务接口,以便可以跨项目引用它们。使用此技术,您可以直接在此层中注册数据层服务。

这两种技术都有利有弊。第一种技术适合更传统的应用程序生命周期,其中应用程序可以从它使用的不同模块决定它想要哪些服务。当涉及插件时,可以使用第二种技术。在这种情况下,应用程序不知道所有可用的服务,并且可以将其初始化的一部分委托给各个插件。

作为旁注,请不要忘记依赖注入不会强制您使用IoC容器。最后,一个简单的方法,如Buy(IProduct product)使用DI模式。这取决于将在外部提供的产品。在将此模式与服务一起使用时,IoC容器的作用是简化此过程。这不是模式。