Press "Enter" to skip to content

InvalidOperationException: Unable to resolve service for type [INazwa] while attempting to activate [MojKontroler]

Mam taką manierę, że jak ogarnęłam jak się coś robi w jednym miejscu, czasami się rzucam na pałę i zbyt analogicznie próbuję to zrobić w drugim.
Bawiłam się w autofac pod desktopem i fajnie było, więc próbując uczyć się pisać webapi (pod kątem pisania pracy dyplomowej) postanowiłam że sobie też poużywam, bo zaczęło mi się podobać, że jak chcę użyć funkcji z innej klasy, to zamiast kombinować z tworzeniem klas z jej zależnościami, po prostu wrzucam interfejs w konstruktor i gotowe, mam całkiem świeży obiekt na moje potrzeby.

Także miałam sobie klasę z jedną metodą

 public IContainer Bootstrap()
        {
            var builder = new ContainerBuilder();
          //tu różne builder.Registry
            return builder.Build();
        }

po czym w w App.xaml.cs miałam private Bootstrapper bootstrapper = new Bootstrapper();
i w OnStartup coś takiego:

IContainer container = bootstrapper.Bootstrap();
            var mainViewModel = container.Resolve<MainViewModel>();
            MainWindow = new MainWindow(mainViewModel);
            MainWindow.Show();

potem sobie hulałam aż miło, do czasu aż postanowiłam przenieść to do weba. A dokładnie do mojego selfhostowanego api (tak, tego co na kompie ze śp matrycą nie chciało działać z poziomu VS dunno why, jak się dowiem to na pewno napiszę, niestety serwis lenovo się nie śpieszy i od wielkiego piątku nie zdążyli nawet – jeśli wierzyć panu co odebrał ode mnie telefon, poddać go diagnozie), co je odpalam jako aplikację konsolową. Naturalne więc się wydawało, by wstrzelić ów kod do maina.

I błąd. Swoją drogą fajnie wyglądają exceptiony w api przez przeglądarkę – podoba mi się;) Mało co potrafi się tak pięknie wyjebać.

Całkiem ładnie wyglądający exception, aż sobie screena zachowałam

Ale wracajmy do tego, że ma działać, no więc, jako że to typowy błąd początkującego, przeczesałam pewien znany „wykop z rozwiązaniami dla programistów” z przepełnieniem stosu w nazwie.

Co się okazało, ożenienie autofaca z asp.net core web api jest możliwe i wymaga drobnych modyfikacji i doinstalowania jednej nugetpaczki więcej. A imię jej Autofac.Extensions.DependencyInjection.

Ok, paczka załadowana, teraz należy przejść do Maina i wywalić dodany przez siebie syf, a następnie przejść do Startup.cs, dodać zmienną

public IContainer ApplicationContainer { get; private set; }

i zmodyfikować funkcję ConfigureServices na taką (tak, wartość zwracana też ma się zmienić):


 public IServiceProvider ConfigureServices(IServiceCollection services)
        {
            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
            var builder = new ContainerBuilder();
            //tu dać te same registery co by się normalnie dało
            builder.Populate(services);
            ApplicationContainer = builder.Build();
            return new AutofacServiceProvider(ApplicationContainer);
        }

Pozwolić pododawać usingi (ostrożnie! Ale bez obaw, któreś zadziałają).

I śmiga;)

Robi się późno więc wrzucam wpis i idę spać.
PS sorki za brzydkie listingi i niedziałające tagi i kategorie (niektóre), w którymś momencie to poogarniam. Update wordpressa nieźle go popsuł. Na razie priorytetem jest jednak magisterka, mam nadzieję, że mi wybaczycie.

One Comment

  1. InvalidOperationException: Unable to resolve service for type [INazwa] while attempting to activate [MojKontroler]

    Dziękujemy za dodanie artykułu – Trackback z dotnetomaniak.pl

Comments are closed.