Skip to content

The priority logic for selecting parameters in the decorator pattern is incorrect #1459

@zms9110750

Description

@zms9110750

Describe the Bug

The priority logic for selecting types in the decorator pattern is incorrect.

Steps to Reproduce

var builder = new ContainerBuilder();
builder.RegisterType<A>().As<IA>();
builder.RegisterType<Ab>().As<IAb>();
builder.RegisterDecorator<D, IA>();
/*builder.RegisterDecorator<IA>(
  (context, parameters, instance) =>
  {
	  Console.WriteLine(instance.GetType());
	  Console.WriteLine(context.Resolve<IAb>().GetType());

	  return new D(context.Resolve<IAb>(), instance);
  });*/

var container = builder.Build();

var d = container.Resolve<IA>();

interface IA;
interface IAb : IA;
class A : IA;
class Ab : IAb;
record D(IAb ab, IA a) : IA;

Expected Behavior

Use the correct registered types to inject into D and let D replace IA.

Exception with Stack Trace

Unhandled exception. Autofac.Core.DependencyResolutionException: An exception was thrown while activating D.
 ---> Autofac.Core.DependencyResolutionException: An exception was thrown while invoking the constructor 'Void .ctor(IAb, IA)' on type 'D'.
 ---> System.InvalidCastException: Unable to cast object of type 'A' to type 'IAb'.
   at lambda_method3(Closure, Object[])
   at Autofac.Core.Activators.Reflection.BoundConstructor.Instantiate()
   --- End of inner exception stack trace ---

Dependency Versions

Autofac: Autofac: 8.2.1

Additional Info

  • The issue arises when Autofac attempts to resolve IA using RegisterDecorator. The decorator D expects an IAb parameter, but Autofac incorrectly attempts to provide an instance of A (which only implements IA), leading to an InvalidCastException.
  • The Ab class is explicitly registered as IAb, so it should be recognized as a valid implementation for both IA and IAb.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions