InstancePerLifetimeScope
과 InstancePerRequest
은 종종 동일한 바 이얼이지만 분명히 다른 의도가 있습니다. 의도하지 않은 부작용을 쉽게 생성하기 때문에 드롭 인 대체품으로 InstancePerLifetimeScope
을 사용하지 않는 것이 좋습니다. 예를 들어, 웹 요청 기간 동안 만 살고 자했던 서비스가있는 경우 (갑자기 루트 범위에서 해결 되었기 때문에) 응용 프로그램이 실행되는 동안 갑자기 수명이 다합니다.
이 효과는 작업 주자 내에서 더 나빠질 수 있습니다. 특히 자신의 수명 범위를 만들지 않는 경우 - 은 모두 하나의 작업이 인스턴스를 공유 함을 의미합니다. 그것에 의존하는 모든 다른 직업을 가진 서비스.
실제로 InstancePerRequest()
은 InstancePerMatchingLifetimeScope()
에 잘 대표 된 수명 범위 태그 (MatchingScopeLifetimeTags.RequestLifetimeScopeTag
에서 얻을 수 있음)를 위임합니다. 예를 들어, 평생 범위 태그를 생성자 매개 변수로 사용하도록 Autofac 모듈을 변경할 수 있습니다.
internal class MyModule : Module
{
private string _lifetimeScopeTag;
public MyModule(string lifetimeScopeTag)
{
_lifetimeScopeTag = lifetimeScopeTag;
}
protected override void Load(ContainerBuilder builder)
{
builder.RegisterAssemblyTypes()
// equivalent to: .InstancePerRequest()
.InstancePerMatchingLifetimeScope(_lifetimeScopeTag);
}
}
평생 함께, 당신은 지금이 동작을 모방 할 수, 작업 러너를 들어
internal static class WebIoC
{
public static IContainer BuildContainer()
{
var lifetimeScopeTag = MatchingScopeLifetimeTags.RequestLifetimeScopeTag;
var builder = new ContainerBuilder();
builder.RegisterModule(new MyModule(lifetimeScopeTag));
return builder.Build();
}
}
: 웹에서 컨테이너를 구축 할 때
지금, 당신은 잘 알려진 수명 범위 태그를 제공해야 너 자신의 범위 태그!
internal static class JobRunnerIoC
{
public const string LifetimeScopeTag = "I_Love_Lamp";
public static IContainer BuildContainer()
{
var builder = new ContainerBuilder();
builder.RegisterModule(new MyModule(LifetimeScopeTag));
// Don't forget to register your jobs!
builder.RegisterType<SomeJob>().AsSelf().As<IJob>();
builder.RegisterType<SomeOtherJob>().AsSelf().As<IJob>();
return builder.Build();
}
}
(내가 여기 당신의 작업의 각 인터페이스를 구현 있으리라 믿고있어,의 그것과 같다 가정 해 봅시다) :
public interface IJob
{
Task Run();
}
지금 당신은 그냥 자신의 평생 범위에서 작업을 실행해야 예 :
public class JobRunner
{
public static void Main(string[] args)
{
var container = JobRunnerIoC.BuildContainer();
// Find out all types that are registered as an IJob
var jobTypes = container.ComponentRegistry.Registrations
.Where(registration => typeof(IJob).IsAssignableFrom(registration.Activator.LimitType))
.Select(registration => registration.Activator.LimitType)
.ToArray();
// Run each job in its own lifetime scope
var jobTasks = jobTypes
.Select(async jobType =>
{
using (var scope = container.BeginLifetimeScope(JobRunnerIoC.LifetimeScopeTag))
{
var job = scope.Resolve(jobType) as IJob;
await job.Run();
}
});
await Task.WhenAll(jobTasks);
}
}
작업 주자에게 범위가 필요합니까? – john
잘 모르겠습니다. 이 애플리케이션에서 작업을 실행할 때마다 내 서비스를 해결하고 작업 완료시 종료 할 수 있기를 원합니다. 필자의 어려움은 내 웹 응용 프로그램뿐만 아니라 직업 주자를 모두 충족하도록 구성을 설정하는 방법을 아는 것입니다. –
'InstancePerLequest()'는'InstancePerRequest()'만이 특정 수명 범위이고, 평생 범위가 없으면 루트 범위를 사용해야하기 때문에'InstancePerLifetimeScope()'만으로도 충분할 것입니다. – john