c# - 使用 Ninject 的项目依赖项

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

继续学习依赖注入(inject),我对一些项目及其依赖关系之间的关系有一些疑问。

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数据访问层下的类。

我做错了什么吗? 在我的构想中,我不必在表示层中引用数据访问层。

家庭 Controller 构造函数

    private readonly IReceitaRepository repositorio;

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

        this.repositorio = repositorio;
    }

最佳答案

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

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

顺便说一句,不要忘记依赖注入(inject)不会强制您使用 IoC 容器。最后,诸如 Buy(IProduct 产品) 之类的简单方法使用了 DI 模式。这取决于外部提供的产品。 IoC 容器所做的就是在服务中使用此模式时简化此过程。这不是模式。

关于c# - 使用 Ninject 的项目依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25405906/

相关文章:

asp.net-mvc - 带有存储库和 ninject 的 ASP.NET MVC MembershipProvider

c# - 获取程序集中的类型(错误 : System. Reflection.ReflectionTypeLoadException)

c# - 将 PDF 文件从 Fiddler 上传到 WebAPI 方法导致 415 Unsupported Media Type

c# - 串行任务执行器;这个线程安全吗?

c# - 使用更改的默认打印机设置打印 PDF

c# - 让页面读取从另一个页面发布到它的值的最佳方法是什么?

asp.net-mvc - MVC4 中捆绑的正确方法

c# - 使用 msbuild 从网站部署中排除文件

asp.net - 重定向到 returnUrl 在 Asp.Net MVC5 中如何工作

c# - 获取类的完全限定名称?