Plugin copy and caching- part 14

I have had 2 problems to solve

  1. How to put the plugins for the console and web api ?
  2. How to cache the data  ? ( plugins / exchange rates)


The solution for the first problem should be easy for the programmer PC, and for the deploying the application ( console/ web api/ etc )There are several solutions :

  1. Each plugin knows where to copy the dll ( console/web api)
  2. The application ( console / webapi) knows a special place from which to copy the plugin definition


I tend to agree with both – but mostly with the second. So … the idea is as follows:

The plugin builds and copy the output to a special folder, named “plugins” ( what a surprise, righyt?)

The console /webapi copies the folder plugins under his directory


The only problem here is that we should ensure that plugins are build first, even if the application does NOT have reference to them.

For this, there is a special menu in VS for solution, namely “build order” – you go to this –and after to the second tab, project dependencies. For the console and web I select as dependency the two loading projects – InfoValutarNBR and InfoValutarECB. The changes are reflected into the sln file

I could have done this on just the InfoValutarLoadingLibs project – but maybe I can have another way to load the libraries ( not so much for the moment )

So now I begin to modify what happens

after build events for InfoValutarNBR and InfoValutarECB

xcopy “$(TargetDir)*.*” “$(SolutionDir)plugins\$(ProjectName)” /E /F /I /Y /R

and pre build events for InfoValutarDOS and InfoValutarWebAPI.

Now, there are several things to do:

  1. Add to .gitignore the plugins folder to not put into the source control( ok)
  2. Write some documentation about the process
  3. Think about linux/docker compiling – there is a xcopy there  ?


About the documentation –  I just did. More, I create a InfoValutarPluginStarter , in order for others to copy this project and make a new plugin.

Realized also that the WebAPI could be simpler

public IAsyncEnumerable<ExchangeRates> Rates([FromRoute] string bank)

And also that I should throw another exception if Bank is null or empty:

throw new ArgumentNullException($”{nameof(bank)} cannot be empty”);


For docker compiling – next time


And one hour passes...
(This is the result of 1 hour per day auto-challenge as a full cycle developer for an exchange rates application)
( You can see the sources at )
2Reading NBR from internet
3Source control and build
4Badge and test
5CI and action
6Artifacts and dotnet try
7Docker with .NET Try
9Intermezzo - Various implementations for programmers
10Intermezzo - similar code - options
11Plugin implementation
12GUI for console
14Plugin in .NET Core 3
15Build and Versioning
16Add swagger
17Docker - first part
18Docker - second part
19Docker - build Azure
20Pipeline send to Docker Hub
21Play with Docker - online
22Run VSCode and Docker
23Deploy Azure
24VSCode see tests and powershell
25Code Coverage
26Database in Azure
27Sql In Memory or Azure
28Azure ConString, RSS
29Middleware for backward compatibility
30Identical Tables in EFCore
31Multiple Data in EFCore
32Dot net try again
33Start Azure Function
34Azure function - deploy
35Solving my problems
36IAsyncEnumerable transformed to IEnumerable and making Azure Functions works
37Azure functions - final
38Review of 37 hours
39Last Commit in AzureDevOps
40Create Angular WebSite
41Add static Angular to WebAPI .NET Core
42Docker for Angular
43Angular and CORS
44SSL , VSCode, Docker
45Routing in Angular
46RxJS for Routing
47RxJs Unsubscribe