Skip to content

IEnumerable<Scoped<T>> doesn't work as expected #230

@jods4

Description

@jods4

Let's say your container contains many IFrob exports, let's call them Frob1 and Frob2.

If you want all of them you can Locate<IEnumerable<IFrob>>(), which will give you Frob1, 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 with Frob1, 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 same IFrob: Frob2, Frob2 (based on priority, etc.)

It seems to me that Scoped "forgets" what specific IFrob it was supposed to be and just performs a plain Locate<IFrob> again, which is not what I want.
This makes Scoped<IFrob> useless/incompatible with IEnumerable. In fact, just locating IEnumerable<Scoped<IFrob>> returns Frob2, 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-IFrob meta information (before invoking the factory; meta infos seem to be right) and named scopes (seems to work ok as well).

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions