Ошибка регистрации Ioc: текущий тип является интерфейсом и не может быть создан.Вам не хватает отображения типов? - PullRequest
0 голосов
/ 04 июня 2018

Я пишу код 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, поэтому он не подходит для моего случая.

Текущий тип является интерфейсом и не может быть создан,Вам не хватает отображения типов?

Он забывает зарегистрировать конкретный класс.

1 Ответ

0 голосов
/ 05 июня 2018

Я нашел решение.Я не могу инициализировать классы внутри библиотеки классов самостоятельно.Когда веб-слой видит все слои, скажем, Модель, Презентация, Репозиторий и Сервис и когда все интерфейсы были созданы в веб-слое, он работает.Главное, что мы должны здесь понять, это то, что интерфейсы внутри библиотек классов не могут быть инициализированы внутри библиотеки классов.

...