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.