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ć.

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
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.