simpleinjector / SimpleInjector

An easy, flexible, and fast Dependency Injection library that promotes best practice to steer developers towards the pit of success.
https://simpleinjector.org
MIT License
1.21k stars 155 forks source link

Resolve dependency by delegate, that itself needs another dependency #446

Closed rs-mzt closed 7 years ago

rs-mzt commented 7 years ago

Hi! I have some service that uses repository factory to get user repository.

class SomeService
{
  private IReposFactory _reposFactory;

  public SomeService(IReposFactory reposfactory) 
  { 
    _reposFactory = reposFactory; 
  }

  void SomeMethod()
  {
     var userRepos = factory.GetRepos<User>();
     //some actions
  }
}

But I can't just configure my factory like this container.Register<IFactory, Factory>(), because to create Factory I use FactoryBuilder, that itself depends on other dependecy.

So I must write code like this:

container.Register<SomeDependency>();
container.Register<IFactory>(() => 
  new FactoryBuilder(container.GetInstance<SomeDependency>()).Build());

What's the problem is I want FactoryBuilder to resolve it dependecies automatically and I can't found solution. That's why I have written this extension method:

public static void Register<TService>(
    this Container container, 
    Type tCreator,
    Func<dynamic, TService> instanceCreator)
    where TService : class
{
    container.Register<TService>(() =>
    {
        var creatorInstance = container.GetInstance(tCreator);
        var service = (TService)instanceCreator(creatorInstance);
        return service;
    });
}

And then use it like this:

_container.Register<IFactory>(
  typeof(FactoryBuilder), (builder) => builder.Build());

Are you already have something like this?

dotnetjunkie commented 7 years ago

You can do this:

container.Register<SomeDependency>();
container.Register<FacroryBuilder>();
container.Register<IFactory>(() => container.GetInstance<FactoryBuilder>().Build());
rs-mzt commented 7 years ago

Yes, this approach is the way better. Appreciate your quick reply on this!