Beginning from it’s underlying discharge ASP .NET Core accompanies worked in reliance infusion (DI) to help execute Inversion Of Control configuration design. This isn’t something new in .NET and separated from inherent DI in .NET Core, there are different libraries which give same and now and again much further developed reliance infusion execution. A portion of these libraries like AutoFac are accessible for both .NET Framework and .NET Core.
Implicit .NET Core reliance infusion compartment is certainly not the trade for exceedingly progressed AutoFac but rather by and large you will think that its reasonable for the greater part of the prerequisites. I think that its appropriate for a large portion of the situations where I use DI in .NET Core.
Aside from consistently assignments where in the majority of the cases you simply need to infuse explicit interface executions somehow, there are those minutes where you hit the deadlock with ASP.NET Core DI compartment. One of those cases is the point at which you have to enroll different executions of a similar interface. Not as terrible as it appears, there are a few different ways to conquer this impediment and here are some of them which might work for your particular case, however certainly a few thoughts how to tackle your concern.
So the underlying thought is to have once interface and numerous usage of it and figure out how to infuse all the more then one of them in DI compartment. In code, this should look something like this
In a perfect world we would setup the DI compartment in startup like the accompanying
Presently, in a perfect world we would hope to get to interface execution occurrences in a controller constructor
Sadly this isn’t the means by which it will work. In the event that you endeavor to run this code and put the breakpoint on the constructor, you will see that every one of the three parameters are really occasions of ServiceC class as it is the lat one infused and interface IService will be set out to the last one set which is ServiceC class.
We should perceive what are a portion of the alternatives to determine this issue and have the capacity to get to the best possible interface execution class example.
Utilizing nonexclusive sort for every interface execution
This methodology is valuable in situations where you have to create or deal with various sorts by a similar interface structure. One of genuine – life situations for this is taking care of message lines for instance and actualizing Publish-buy in or Event Message Bus designs.
We’ll need to refresh our support of utilization conventional sort which will reflect to code changes in execution classes also
Presently in reliance infusion compartment setup, we can include usage for each explicit nonexclusive sort we will utilize.
This strategy gets called by the runtime. Utilize this technique to add administrations to the compartment.
In a perfect world you would utilize a POCO class as a nonexclusive kind, for instance when perusing from the message line, yet for the straightforwardness I utilized int, String and Boolean sorts. Presently you can have numerous controllers to deal with various kinds. Suppose you have three message lines and you require an enpoint to push the messages to an alternate line.
From the investigate you can see that when we referenced IService we got the real usage class for this conventional sort of the IService interface which is class ServiceA.
Utilizing an agent to choose explicit interface execution
This technique utilizes DI to enlist a Func which return and interface usage relying upon an explicit key. The key can be a basic kind, but since you have to get to a restricted extent of qualities, I like to utilize Enum as a key for the enrolled interface executions. So how about we begin with it by announcing this count. To keep things straightforward, I’ll simply utilize a similar execution class name with capital letter addition toward the end and for enum, I’ll utilize those capital letter postfixes.
Presently we have to utilize Func<ServiceEnum,IService> which will go about as an industrial facility for the IService distinctive executions.
With this child of enrolling interface executions in DI compartment in .NET Core we can’t get to usage class straightforwardly. Rather, we have to reference our Func as a parameter in a constructor and us it to determine the interface usage.
Presently when we have this checked in a troubleshoot, we’ll see that IService interface I legitimately set out to ServiceA class example type
Enroll interface usage as an IEnumerable gathering
Presently we are back to ConfigureServices technique from the earliest starting point of this article where for a similar interface we enlist numerous class types. As much as it looked wrong in any case, .NET Core reliance infusion compartment can deal with this lord of interface usage enrollment.
From the underlying case, where we endeavored to get to infused type occurrences we were getting dependably the last enlisted execution class. The thing is we were endeavoring to get to infused interface executions wrongly. In the event that we reference interface usage as an IEnumerable we will have each of the three execution class examples accessible in an accumulation.
This may be helpful on the off chance that you require your interface usage utilized in a Chain of duty like example. IEnumerable can be your custom pipeline for preparing esteems in your controller. I can’t recall more situations where this is utilized on the grounds that you don’t really approach specific executions, rather you have every one of them in a rundown.
Interestingly, this leaves the container and no extra coding is required.