我正在编写一个 ASP.NET MVC代码,我尝试通过Microsoft Unity实现控制反转。
我按照上面的文件进行操作:
https://learn.microsoft.com/en-us/aspnet/mvc/overview/older-versions/hands-on-labs/aspnet-mvc-4-dependency-injection
这是我的项目结构:
型
介绍
存储 库
服务
蹼
Web 只能看到演示文稿。演示文稿只能看到服务。这是我在 Web 层中的引导程序.cs文件。
public static class Bootstrapper
{
public static IUnityContainer Initialise()
{
var container = BuildUnityContainer();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
return container;
}
private static IUnityContainer BuildUnityContainer()
{
var container = new UnityContainer();
// register all your components with the container here
// it is NOT necessary to register your controllers
container.RegisterType<IButcePresenter, ButcePresenter>();
container.RegisterType<IProjeFaaliyetPresenter, ProjeFaaliyetPresenter>();
container.RegisterType<ISektorPresenter, SektorPresenter>();
container.RegisterType<IProjePresenter, ProjePresenter>();
container.RegisterType<IFaaliyetPresenter, FaaliyetPresenter>();
container.RegisterType<IKurumCografyaLokasyonPresenter, KurumCografyaLokasyonPresenter>();
container.RegisterType<IVeriSaglayici, VeriSaglayici>();
return container;
}
}
我在 Global.asax 中调用 Bootstrapper 类.cs如下所示:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
Bootstrapper.Initialise();
}
}
这是我的主控制器:
public class ErpController : Controller
{
//
private readonly IButcePresenter _butcePresenter;
private readonly IProjeFaaliyetPresenter _iProjeFaaliyetPresenter;
private readonly ISektorPresenter _sektorPresenter;
private readonly IProjePresenter _projePresenter;
private readonly IFaaliyetPresenter _faaliyetPresenter;
private readonly IKurumCografyaLokasyonPresenter _kurumCografyaPresenter;
private readonly IVeriSaglayici _veriSaglayici;
private readonly CevirmeIslemleri _cevirmeIslem;
public ErpController(IButcePresenter butcePresenter, IProjeFaaliyetPresenter projeFaaliyetPresenter,
ISektorPresenter sektorPresenter, IProjePresenter projePresenter, IFaaliyetPresenter faaliyetPresenter, IKurumCografyaLokasyonPresenter kurumCografyaPresenter, IVeriSaglayici veriSaglayici)
{
this._butcePresenter = butcePresenter;
this._iProjeFaaliyetPresenter = projeFaaliyetPresenter;
this._sektorPresenter = sektorPresenter;
this._projePresenter = projePresenter;
this._faaliyetPresenter = faaliyetPresenter;
this._kurumCografyaPresenter = kurumCografyaPresenter;
this._veriSaglayici = veriSaglayici;
this._cevirmeIslem = new CevirmeIslemleri();
}
}
这是我的IButcePresenter。它是在表示层定义的。
public class ButcePresenter : IButcePresenter
{
private readonly IButceServis _butceServis;
private readonly IYetkiServis _yetkiServis;
private readonly IProjeFaaliyetServis _projeFaaliyetServis;
private readonly Cevirme _cevir = null;
private readonly KontrolIslemleri _kontrolIk = null;
public ButcePresenter(IButceServis butceServis, IYetkiServis yetkiServis, IProjeFaaliyetServis projeFaaliyetServis)
{
this._butceServis = butceServis;
this._yetkiServis = yetkiServis;
this._projeFaaliyetServis = projeFaaliyetServis;
this._cevir = new Cevirme();
this._kontrolIk = new KontrolIslemleri();
}
public ButcePresenter()
{
//TODO: Fools man injection
this._butceServis = new ButceServis();
this._yetkiServis = new YetkiServis();
this._projeFaaliyetServis = new ProjeFaaliyetServis();
this._cevir = new Cevirme();
this._kontrolIk = new KontrolIslemleri();
}
}
我无法在 Unity 中定义 IButceServis的具体定义,因为 IButceServis 及其具体实现 ButceServis 位于服务层。Web 图层看不到服务图层。我正在得到
当前类型为 DKMPPIB。Presentation.Soyut.IButcePresenter,是一个 接口,无法构造。是否缺少类型映射?
如何解决问题?你能提供任何线索吗?提前谢谢。
调查: 我已经调查了这些问题,但它们没有帮助:
当前类型是接口,无法构造。是否缺少类型映射?
它要求我创建一个创建控制器工厂。所以我做到了。它不起作用。
异常是:InvalidOperationException - 当前类型,是一个接口,无法构造。是否缺少类型映射?
它滥用了 DI 概念,因此不适合我的情况。
当前类型是一个接口,无法构造。是否缺少类型映射?
他忘记了注册具体课程。
我找到了解决方案。我无法独立初始化类库中的类。当 Web 层看到所有层(例如模型、表示、存储库和服务(时,当所有接口都已在 Web 层中实例化时,它就可以工作了。我们应该在这里了解的主要事情是类库内的接口不能在类库中初始化。