Injecting concrete implementations using Unity

I have 2 interface implementations where I need to inject the first implementation into one service and the second into another. Each service is also injected with other dependencies that do not have multiple implementations.

So far I have had something like this:

public FirstService(IDataRepository dr, IOtherRepository or)
{
    this.DataRepository = dr;
    this.OtherRepository = or;
}

public SecondService(IDataRepository dr, IAnotherRepository ar)
{
    this.DataRepository = dr;
    this.OtherRepository = ar;
}

      

Then in my bootloader, I:

container.RegisterType<IDataRepository, FirstDataRepository>("First");
container.RegisterType<IDataRepository, SecondDataRepository>("Second");
container.RegisterType<IOtherRepository ,OtherRepositor>();
container.RegisterType<IAnotherRepository ,AnotherRepository>();

container.RegisterType<IFirstService, FirstService>(new InjectionConstructor(new ResolvedParameter<IDataRepository>("First")));
container.RegisterType<ISecondService, SecondService>(new InjectionConstructor(new ResolvedParameter<IDataRepository>("Second")));

      

When I run my application, I get the error "FirstService does not have a constructor that takes parameters (IDataRepository)".

Do I also need to specify the IOtherRepository instance to be injected currently when I specifically specify the IDataRepository instance to be injected? Or am I doing something else wrong?

My actual constructor takes 6 arguments and it would be painful to manually enter each one just because one of them has multiple implementations.

+3


source to share


2 answers


You don't need to supply values ​​for the other parameters, but you do need to supply them Type

so that Unity can figure out which constructor to use.

Registration for IFirstService

will look like this:

container.RegisterType<IFirstService, FirstService>(new InjectionConstructor(new ResolvedParameter<IDataRepository>("First"), typeof(IOtherRepository)));

      



The codeplex TecX project includes ClozeInjectionConstructor

one that deals with situations where you only want to specify one parameter. See the source code in the TecX.Unity project.

Btw: 6 parameters for the constructor is the code smell for the constructor for the anti-pattern injection .

+3


source


container.RegisterType<IFirstService, FirstService>(new InjectionConstructor(new ResolvedParameter<IDataRepository>("First"), new ResolvedParameter<IOtherRepository>()));
container.RegisterType<ISecondService, SecondService>(new InjectionConstructor(new ResolvedParameter<IDataRepository>("Second"), new ResolvedParameter<IAnotherRepository>()));

      



You need to solve the second constructor.

0


source







All Articles