gpt4 book ai didi

c# - 使用 Ninject 的项目依赖

转载 作者:行者123 更新时间:2023-11-30 22:04:09 25 4
gpt4 key购买 nike

继续学习Dependency Injection,我对一些项目和它们的依赖之间的关系有些疑惑。

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 层。该层将包含您所有的服务接口(interface),以便它们可以跨项目引用。使用这种技术,您可以直接在该层中注册您的数据层服务。

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

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com