Autofac - конструктор службы принимает ссылку на экземпляр объекта - PullRequest
2 голосов
/ 14 октября 2010

Как мне поступить:

Текущий код выглядит так;

class Class1 : ISomeInterface
    IFooService _service;
    void SomeMethod(){
        _service = new FooService(this);
        .....
}

class FooService : IFooService
    public FooService(ISomeInterface class1Implementer)
    {
        _class1Implementer = class1Implementer
    }

Я хочу внедрить FooService в Class1 с помощью Autofac.Как проходит эта регистрация?Thanx.

1 Ответ

2 голосов
/ 14 октября 2010

Поскольку Class1 предоставляет данные (ссылку на себя) на 'IFooService`, вы должны ввести фабричный делегат , который принимает эти данные.Рассмотрим следующий код:

class Class1 : ISomeInterface
{
    private readonly IFooService _service;
    public Class1(Func<ISomeInterface, IFooService> fooServiceFactory)
    {
        _service = fooServiceFactory(this);
        .....
    }
}

Теперь регистрация идет просто так:

var builder = new ContainerBuilder();
builder.RegisterType<Class1>().As<ISomeInterface>();
builder.RegisterType<FooService>().As<IFooService>();
var container = builder.Build();

var something = container.Resolve<ISomeInterface>();

Autofac автоматически разрешит тип Func<..> в соответствии с типом IFooService иISomeInterface параметр конструктора.

Обновление: связано с продолжающимся обсуждением в комментариях.Отделение SomeMethod от реализации ISomeInterface:

// Class1 is now oblivious to IFooService
class Class1 : ISomeInterface
{
    public Class1()
    {
    }
}

// Class2 now holds the SomeMethod logic 
class Class2 : ISomeOtherInterface
{
    private readonly IFooService _fooService;
    public Class2(IFooService fooService)
    {
         _fooService = fooService;
    }

    public void SomeMethod()
    {
         // do something with _fooService
    }
}

Если SomeMethod не может быть отделено от Class1, я все равно пошел бы на заводскую альтернативу.Вот небольшая модификация, которая приводит к тому, что IFooService не будет разрешен до тех пор, пока не потребуется, то есть когда вызывается SomeMethod.

class Class1 : ISomeInterface
{
    private readonly Func<ISomeInterface, IFooService> _fooServiceFactory;
    public Class1(Func<ISomeInterface, IFooService> fooServiceFactory)
    {
        _fooServiceFactory = fooServiceFactory;
    }

    void SomeMethod()
    {
        var fooService = _fooServiceFactory(this);
        ....
    }
}

Опять блеск заводских черт Autofac.Для работы делегата Func<ISomeInterface, IFooService> дополнительные регистрации не требуются.

...