继续学习依赖注入(inject),我对一些项目及其依赖关系之间的关系有一些疑问。
我在 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/