Попытайтесь понять, что означает срок действия в IoC (с Autofac)? - PullRequest
0 голосов
/ 01 июня 2018

Сначала я конфиденциально предполагал, что могу это понять, но на каком-то простом примере с Autofac оказалось, что я могу понять это неправильно, вот код, который я пробовал:

//register the service
autofacBuilder.RegisterType<MyService>()
              .As<IMyService>().InstancePerLifetimeScope();
//testing code
void _test1()
{
   var myService = autofacContainer.Resolve<IMyService>();
}
void _test2()
{
    _test1();
    var myService = autofacContainer.Resolve<IMyService>();
}

Протестируйте его, запустив _test2(), и вы можете просто проверить экземпляры, разрешенные в 2 методах.

Итак, с помощью приведенного выше кода я понимаю значения myService в _test1 и myService в_test2 должно быть другим.Потому что я думаю, что время жизни myService в _test1 должно быть именно в этом методе, в то время как время жизни myService в _test2 должно быть и в _test2.Итак, у нас есть 2 разных области действия здесь, но каким-то образом разрешенные экземпляры myService совпадают.

Так что вы не могли бы объяснить мне эту проблему,что именно здесь означает lifetime scope?внутри одного класса?или что-то еще больше?

1 Ответ

0 голосов
/ 01 июня 2018

Вы путаете c # области и области Autofac .Это как сравнивать яблоки и забор.:) Они просто разные и не имеют ничего общего друг с другом.

Итак, чтобы уточнить это, пожалуйста, посмотрите на основные примеры ниже.Обратите внимание, что области действия должны быть на самом деле уничтожены вами, если вы - тот, кто их начал, как это делается в примере 1. В других примерах я пропустил это для краткости.

// example 1
autofacBuilder.RegisterType<MyService>().As<IMyService>().InstancePerLifetimeScope();
var container = autofacBuilder.Build();

void _test1(IComponentContext scope){
    var myService = scope.Resolve<IMyService>();
}

void _test2(IComponentContext scope){
    // the same scope is used here and in _test1()
    // this means that the service instance will be the same here and there
    _test1(scope);
    var myService = scope.Resolve<IMyService>();
}

// it's only here that DI lifetime scope starts
using (var scope = container.BeginLifetimeScope()) {
    _test2(scope);
}



// example 2
autofacBuilder.RegisterType<MyService>().As<IMyService>().InstancePerLifetimeScope();
var container = autofacBuilder.Build();

void _test1(IComponentContext scope){
    var myService = scope.Resolve<IMyService>();
}

void _test2(IComponentContext scope){
    // now new scope is used in _test1() call
    // this means that instances will be different here and there since they are resolved from different scopes
    _test1(scope.BeginLifetimeScope());
    var myService = scope.Resolve<IMyService>();
}

var scope = container.BeginLifetimeScope();
_test2(scope);



// example 3
// NOTE THIS!
autofacBuilder.RegisterType<MyService>().As<IMyService>().InstancePerDependency();
var container = autofacBuilder.Build();

void _test1(IComponentContext scope){
    var myService = scope.Resolve<IMyService>();
}

void _test2(IComponentContext scope){
    // the same scope is used here and in _test1()
    // but now service instances will be different even though they are resolved from the same scope
    // since registration directs to create new instance each time the service is requested.
    _test1(scope);
    var myService = scope.Resolve<IMyService>();
}

var scope = container.BeginLifetimeScope();
_test2(scope);



// example 4
autofacBuilder.RegisterType<MyService>().As<IMyService>().SingleInstance();
var container = autofacBuilder.Build();

void _test0(IComponentContext scope){
    var myService = scope.Resolve<IMyService>();
}

void _test1(IComponentContext scope){
    _test0(scope.BeginLifetimeScope());
    var myService = scope.Resolve<IMyService>();
}

void _test2(IComponentContext scope){
    // all the scopes used here and in other calls are different now
    // but the service instance will be the same in all of them even though it is requested from different scopes
    // since registration directs to get the same instance each time the service is requested regardless of the lifetime scope.
    _test1(scope.BeginLifetimeScope());
    var myService = scope.Resolve<IMyService>();
}

var scope = container.BeginLifetimeScope();
_test2(scope);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...