Я пишу код ASP.NET MVC и пытаюсь реализовать инверсию управления через Microsoft Unity.
Я следую приведенному выше документу:
https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/hands-on-labs/aspnet-mvc-4-dependency-injection
Вот моя структура проекта:
Модель
Презентация
Репозиторий
Служба
Интернет
Интернет может видеть только Презентацию.Презентация может видеть только Сервис.Вот мой файл Bootstrapper.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;
}
}
Я вызываю класс Bootstrapper внутри Global.asax.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();
}
}
Я не могу определить конкретное определение IButceServis в Unity, потому что IButceServis и его конкретная реализация ButceServis находятся на уровне Service.Веб-слой не может видеть слой службы.Я получаю
Текущий тип, DKMPPIB.Presentation.Soyut.IButcePresenter, является интерфейсом и не может быть создан.Вам не хватает сопоставления типов?
Как решить проблему?Не могли бы вы, пожалуйста, какую-нибудь подсказку?Заранее спасибо.
Расследования: я исследовал эти вопросы, и они не помогают:
Текущий тип является интерфейсом и не может быть создан.Вам не хватает отображения типов?
Он спрашивает меня о создании фабрики контроллеров.Так я и сделал.Это не работает.
Исключение составляет: InvalidOperationException - Текущий тип является интерфейсом и не может быть создан.Вам не хватает отображения типов?
В нем неправильно используется концепция DI, поэтому он не подходит для моего случая.
Текущий тип является интерфейсом и не может быть создан,Вам не хватает отображения типов?
Он забывает зарегистрировать конкретный класс.