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>()