继续我在依赖注入方面的研究,我对某些项目与其依赖项之间的关系有一些疑问。
我在App_Start
文件夹
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;
}
答案 0 :(得分:3)
这取决于,如果您希望应用程序中的单个点注册所有服务,这是可以接受的。您可以做的其他事情是向应用程序添加API层,域和数据访问将使用该层。该层将包含所有服务接口,以便可以跨项目引用它们。使用此技术,您可以直接在此层中注册数据层服务。
这两种技术都有利有弊。第一种技术适合更传统的应用程序生命周期,其中应用程序可以从它使用的不同模块决定它想要哪些服务。当涉及插件时,可以使用第二种技术。在这种情况下,应用程序不知道所有可用的服务,并且可以将其初始化的一部分委托给各个插件。
作为旁注,请不要忘记依赖注入不会强制您使用IoC容器。最后,一个简单的方法,如Buy(IProduct product)
使用DI模式。这取决于将在外部提供的产品。在将此模式与服务一起使用时,IoC容器的作用是简化此过程。这不是模式。