Reputation: 1415
I have the below code that is returning null when I try and return Sales Data. It works if I remove the other constructor for employee, so I believe it is a constructor injection issue.
How do I handle this injection?
Repository: Located in a seperate Project
public class CompanyRepository : ICompanyRepository, IDisposable
{
public CompanyRepository()
{
}
private readonly IEmployeeRepository _employeeRepository;
public CompanyRepository(IEmployeeRepository parameter)
{
_employeeRepository = parameter;
}
//fails never hits this
private readonly ISalesRepository _salesRepository;
public CompanyRepository(ISalesRepository parameter)
{
_salesRepository = parameter;
}
}
MVC 5 Controller:
[HttpGet]
public ActionResult Create()
{
//works
var a = _CompanyRepository.GetCompanyData();
//works
var b = _CompanyRepository.GetEmployeeData();
//fails
var c = _CompanyRepository.GetSalesData();
//return view etc
}
App_Start Unity.Config
public static class UnityConfig
{
public static void RegisterComponents()
{
var container = new UnityContainer();
// register all your components with the container here
// it is NOT necessary to register your controllers
container.RegisterType<ICompanyRepository, CompanyRepository>();
//this one is failing
container.RegisterType<ICompanyRepository, CompanyRepository>(new InjectionConstructor(new ResolvedParameter<SalesRepository>()));
container.RegisterType<ICompanyRepository, CompanyRepository>(new InjectionConstructor(typeof(EmployeeRepository)));
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
}
I was just using but it is not working either
container.RegisterType<ICompanyRepository, CompanyRepository>(new InjectionConstructor(typeof(SalesRepository)));
container.RegisterType<ICompanyRepository, CompanyRepository>(new InjectionConstructor(typeof(EmployeeRepository)));
Upvotes: 2
Views: 1628
Reputation: 577
You should name your InjectionConstructor registrations
container.RegisterType<ICompanyRepository, CompanyRepository>("salesRep", new InjectionConstructor(new ResolvedParameter<SalesRepository>()));
container.RegisterType<ICompanyRepository, CompanyRepository>("employeeRep",new InjectionConstructor(new ResolvedParameter<EmployeeRepository>()));
And then resolve like this
var salesRep = container.Resolve<ICompanyRepository>( "salesRep" );
var employeeRep = container.Resolve<ICompanyRepository>( "employeeRep" );
An alternative to resolving is to change your constructors to
public CompanyRepository([Dependency("employeeRep")]IEmployeeRepository parameter)
public CompanyRepository([Dependency("salesRep")]ISalesRepository parameter)
and then use the DependencyResolver
Upvotes: 2