AutoFac - Как зарегистрировать и разрешить объект с параметром?

public class FooController : ApiController
{
   private IDb db;
    public FooController (IDb context)
    {
        db = context;
    }

    public void DoSomething(string value)
    {
        var output = new DoSomethingElse(value);
    }
}

DoSomethingElse Объект используется несколькими методами в этом классе, но это не является обязательным требованием для всех методов. Как мне зарегистрироваться и решить DoSomethingElse?

1 ответ

Решение

Проблема как я понимаю

public class FooController : ApiController
{
   private IDb db;
    public FooController (IDb context)
    {
        db = context;
    }

    public void DoSomething(string value)
    {
        var output = new DoSomethingElse(value);
    }
}

Вы не хотите создавать экземпляр DoSomethingElse введите каждый раз, когда вы создаете FooController, Вы также хотите предоставить ему значение во время выполнения.

Так что это требует фабричного шаблона:

public interface IDoSomethingElseFactory
{
    IDoSomethingElse Create(string value);
}

public class DoSomethingElseFactory : IDoSomethingElseFactory
{
    public IDoSomethingElse Create(string value)
    {
        // Every call to this method will create a new instance
        return new DoSomethingElse(value);
    }
}

public class FooController : ApiController
{
    private IDb db;
    private readonly IDoSomethingElseFactory doSomethingElseFactory;

    public FooController (
        IDb context,
        IDoSomethingElseFactory doSomethingElseFactory)
    {
        db = context;
        this.doSomethingElseFactory = doSomethingElseFactory;
    }

    public void DoSomething(string value)
    {
        // this will be the point at which a brand new
        // instance of `DoSomethingElse` will be created.
        var output = doSomethingElseFactory.Create(value);
    }
}

Затем зарегистрировать это:

builder.RegisterType<DoSomethingElseFactory>()
       .As<IDoSomethingElseFactory>()
Другие вопросы по тегам