Mahesh kumar Chiliveri
Mahesh kumar Chiliveri

Reputation: 484

Unity resolving nested constructors

I am having two interfaces like ICustomerRepository, IBalanceRepository which are implemented by CustomerRepository.cs and BalanceRepository. Now for entry i have customerservice.cs with constuctor accepting instance of ICustomerRepository. I am calling a method from customerservice.cs to BalanceService.cs which is having constructor accepting instance of IBalancerepository. I registered all classes using unity and resolved customer service, this is resolving ICustomerRespository but not IBalanceRepository. Can we resolve IBalanceRepository repository like this or not? See below code and suggest a solution.

public interface ICusotmerRepository
{
   void Add(string strCustomer);
}

public interface IBalanceRepository
{
    void Add(decimal decAmount);
}

class CusotmerRepository : ICusotmerRepository
{
    public void Add(string strCustomer)
    {
        Console.WriteLine("Added customer "+strCustomer);
    }
}

class BalanceRepository : IBalanceRepository
{
    public void Add(decimal decAmount)
    {
        Console.WriteLine("added amount "+decAmount);
    }
}

public class BalanceService
{
    private readonly IBalanceRepository _balanceRepository;

    public BalanceService(IBalanceRepository balanceRepository)
    {
        _balanceRepository = balanceRepository;
    }

    public BalanceService()
    {
    }

    public void AddBalance(decimal decBalance)
    {
        _balanceRepository.Add(decBalance);
    }
}

class CustomerService
{
    private readonly ICusotmerRepository _cusotmerRepository;
    public CustomerService(ICusotmerRepository cusotmerRepository)
    {
        _cusotmerRepository = cusotmerRepository;
    }

    public void Process(string strCustomerName, decimal decBalance)
    {
        _cusotmerRepository.Add(strCustomerName);
        var objBalanceService = new BalanceService();
        objBalanceService.AddBalance(decBalance);
    }
}

class Program
{
    static void Main(string[] args)
    {
        var container = new UnityContainer();
        container.RegisterType<IBalanceRepository, BalanceRepository>();
        container.RegisterType<ICusotmerRepository, CusotmerRepository>();

        var customerService = container.Resolve<CustomerService>();
        customerService.Process("Ganesha",7);
    }
}

Upvotes: 0

Views: 678

Answers (2)

D Stanley
D Stanley

Reputation: 152521

The problem is here:

public void Process(string strCustomerName, decimal decBalance)
{
    _cusotmerRepository.Add(strCustomerName);
    var objBalanceService = new BalanceService();    <------------
    objBalanceService.AddBalance(decBalance);
}

You are calling the parameterless constructor directly - there's nowhere for Unity to "inject" the dependency into BalanceService.

I see three possibilities:

  1. Add a constructor parameter to CustomerService for BalanceService and let Unity inject it
  2. Add a constructor parameter to CustomerService for IBalanceRepository and let Unity inject it, passing it in when you construct BalanceService
  3. Add IBalanceRepository or BalanceService as a parameter to Process

Upvotes: 1

Pavel Pykhtin
Pavel Pykhtin

Reputation: 353

You can't resolve BalanceService in this way because Unity will not be able to know when you need to resolve this dependency. You can inject BalanceService into customer service through constructor parameter.

Upvotes: 1

Related Questions