Почему фабрики делегатов AutoFac, зарегистрированные InstancePerRequest, вызываются каждый раз, когда вводится тип

Я использую Delegate Factory для создания объекта с помощью статической функции .Create(), потому что создание объекта несколько тяжелое и не относится к конструктору. Этот объект (UserToken) используется на каждом контроллере Mvc.

Я заметил в своем примере кода, что при регистрации с помощью функции делегата AutoFac для создания UserToken UserToken.Create() вызывается несколько раз для каждого запроса. Я ожидал, что он будет вызываться только один раз для каждого запроса, а результирующий UserToken будет храниться и повторно использоваться сборщиком. Что мне здесь не хватает? Я хочу, чтобы UserToken.Create вызывался только один раз для каждого запроса.

builder.Register<Func<HttpContextBase, IUnitOfWork, UserAccountToken>>(
    c => {
            var db = c.Resolve<IUnitOfWork>();
            var hc = c.Resolve<HttpContextBase>();

            return (context, database) => { return UserAccountToken.Create(hc, db); };
         }).InstancePerRequest();

builder.Register<UserAccountToken>(
    c => {
            var db = c.Resolve<IUnitOfWork>();
            var hc = c.Resolve<HttpContextBase>();

            return UserAccountToken.Create(hc, db);

         }).As<IUserAccountToken>().InstancePerRequest();

person Marcus Cobb    schedule 20.04.2017    source источник


Ответы (1)


Я не уверен, как вы используете зарегистрированный тип Func<HttpContextBase, IUnitOfWork, UserAccountToken>. Вы в основном возвращаете функцию, которая получает два параметра, которые вы никогда не используете. (context и database).

Я предполагаю, что для создания IUserAccountToken вам нужно только вызвать UserAccountToken.Create() и передать соответствующие параметры. В этом случае вам потребуется только вторая регистрация.

Было бы только:

builder.Register<UserAccountToken>(c =>
{
    var db = c.Resolve<IUnitOfWork>();
    var hc = c.Resolve<HttpContextBase>();

    return UserAccountToken.Create(hc, db);

})
    .As<IUserAccountToken>()
    .InstancePerRequest();
person Maximo Dominguez    schedule 20.04.2017