Repository navigation
IEnumerable<Scoped<T>> doesn't work as expected #230
Description
Activity
- changed the title
[-]IEnumerable<Func<Scoped<T>>> doesn't work as expected[/-][+]IEnumerable<Scoped<T>> doesn't work as expected[/+]on Jul 25, 2019 I see what you mean it's really not a robust implementation. I'll need to think about it a bit to see what's the best solution for this.
Can you advise a workaround in the meantime? I'm having a hard time figuring out how to do this any other way.
I want to be able:
- know about every
IFrob, especially their metadata. - instantiate specific
IFrobon demand, in their own scope.
- know about every
Sorry meant to reply this weekend. There isn't a good work around for the moment but I do think I should be able to find some time this weekend to fix it properly and do a beta release.
Thanks.
FWIW I managed to workaround the problem but it's very convoluted.
I used named exports instead metadata; then i'm casting theIExportLocatorScopetoDependencyInjectionContainerso that I can useStrategyCollectionContainer.GetActivationStrategyCollectionto enumerate all keys and metadata related to an interface; finally I can create a lifetime scope andLocatethe interface and key previously gathered to find the instance that I want.It's ugly :(
but it works for now.- added a commit that references this issue
on Aug 5, 2019 I have one more issue I need to address before I can do a beta release but you can test the fix in the nightly nuget feed
Thanks!
Switching feeds is a bit complicated (don't ask) but if you do a prerelease on Nuget I can test.
Otherwise I can wait a little bit more.- added a commit that references this issue
on Aug 10, 2019 I've released a new version 7.1.0-beta
Thanks, I referenced the 7.1 beta and it works now! ❤️
Let's say your container contains many
IFrobexports, let's call themFrob1andFrob2.If you want all of them you can
Locate<IEnumerable<IFrob>>(), which will give youFrob1, Frob2.Maybe you want to be able to spawn new frobs and locating
IEnumerable<Func<IFrob>>does give you two factories. If you.Select(f => f())then you end up withFrob1, Frob2, as expected.Now let's say that in addition to that you want each factory to resolve in a new scope. You locate
IEnumerable<Func<Scoped<IFrob>>>which returns 2 factories as expected. But (ignoring Dispose for now) if you look at.Select(f => f().Instance)then you'll notice every scoped instance resolves to the sameIFrob:Frob2, Frob2(based on priority, etc.)It seems to me that
Scoped"forgets" what specificIFrobit was supposed to be and just performs a plainLocate<IFrob>again, which is not what I want.This makes
Scoped<IFrob>useless/incompatible withIEnumerable. In fact, just locatingIEnumerable<Scoped<IFrob>>returnsFrob2, Frob2.This is a simplified test case. My full code was:
IEnumerable<Meta<Func<string, Scoped<T>>>>because on top of that I wanted per-
IFrobmeta information (before invoking the factory; meta infos seem to be right) and named scopes (seems to work ok as well).