sturdytree
sturdytree

Reputation: 859

Using Microsoft Unity IOC, how can you pass it an existing object to inject?

So if I have:

public class CustomerViewModel
{
    public CustomerViewModel(ICustomer customer)
    {
        this.customer = customer
    }
}

then is there a way to achieve:

ICustomerViewModel customerViewModel = container.Resolve<ICustomerViewModel>(existingCustomer);

Upvotes: 0

Views: 1273

Answers (3)

Damian Schenkelman
Damian Schenkelman

Reputation: 3535

Check the 'Can I pass constructor parameters to Unity's Resolve() method?' question (also on Stack Overflow).

Upvotes: 0

Mike Valenty
Mike Valenty

Reputation: 8981

If you want to build-up an existing instance through property and method injection, you can use the following:

var model = new CustomerViewModel(customer);
model = container.BuildUp(model);

In general I would not recommend using this feature of Unity. Sometimes you need it, but it's usually a warning sign that could be fixed by adjusting the design a bit to work more naturally with IoC as a pattern (not a framework). With more details on how you are using it, the SO community can probably offer some other options...

Upvotes: 3

Jollymorphic
Jollymorphic

Reputation: 3530

Since the dependency injection container is designed to provide finished objects, you'll need to use a factory pattern (which is quite common in these cases) to achieve your desired configuration:

public interface ICustomerViewModelFactory {
   public ICustomerViewModel GetModelFor(ICustomer customer);
}

public class CustomerViewModelFactory : ICustomerViewModelFactory {
   public ICustomerViewModel GetModelFor(ICustomer customer) {
      return new CustomerViewModel(customer);
   }
}

// elsewhere...
container.RegisterInstance<ICustomerViewModelFactory>(new CustomerViewModelFactory());

// and finally...
ICustomerViewModelFactory factory = container.Resolve<ICustomerViewModelFactory>();
ICustomerViewModel customerViewModel = factory.GetModelFor(existingCustomer);

Upvotes: 1

Related Questions