Тип регистрации с фабричным делегатом - PullRequest
1 голос
/ 23 августа 2011

Есть ли способ в Autofac зарегистрировать тип с фабричным делегатом, который вызывается при запросе этого типа?Как то так:

builder.RegisterType<MyType>().AsSelf()
       .WithFactory((IMyService s, ISomeDependency d) =>
                    {
                        var p1 = s.DoSomething();
                        var p2 = d.DoSomething(p1, true);
                        return new MyType(p1, p2);
                    });

1 Ответ

2 голосов
/ 23 августа 2011

Это, вероятно, не совсем то, что вы ожидаете, но все-таки работает:

builder.Register<MyType>(container =>
{
    var s = container.Resolve<IMyService>();  
    var d = container.Resolve<ISomeDependency>();

    var p1 = s.DoSomething();
    var p2 = d.DoSomething(p1, true);
    return new MyType(p1, p2);
});

Или, если вы хотите использовать автоматическое (конструктор) внедрение, вы можете создать подкласс MyType (внутри Композиция Root ), которая принимает две зависимости.Этот тип может быть легко зарегистрирован:

builder.RegisterType<AutofacMyType().As<MyType>();

// Define inside Composition Root
private sealed class AutofacMyType : MyType
{
    public AutofacMyType(IMyService s, ISomeDependency d)
        : this(s.DoSomething(), d) { }

    private AutofacMyType(Something p1, ISomeDependency d)
        : base(p1, d.DoSomething(p1, true)) { }
}
...