sana daha iyi bir yeni ömür boyu seçeneği sunarak AutoFac uzatmak düşünüyorum. Ben Autofac kaynaklar aldı ve onları biraz modifiye:
public static class RegistrationBuilderExtensions
{
public IRegistrationBuilder<TLimit, TActivatorData, TRegistrationStyle> InstancePerMatchingOrRootLifetimeScope(this IRegistrationBuilder<TLimit, TActivatorData, TRegistrationStyle> builder, params object[] lifetimeScopeTag)
{
if (lifetimeScopeTag == null) throw new ArgumentNullException("lifetimeScopeTag");
builder.RegistrationData.Sharing = InstanceSharing.Shared;
builder.RegistrationData.Lifetime = new MatchingScopeOrRootLifetime(lifetimeScopeTag);
return builder;
}
}
public class MatchingScopeOrRootLifetime: IComponentLifetime
{
readonly object[] _tagsToMatch;
public MatchingScopeOrRootLifetime(params object[] lifetimeScopeTagsToMatch)
{
if (lifetimeScopeTagsToMatch == null) throw new ArgumentNullException("lifetimeScopeTagsToMatch");
_tagsToMatch = lifetimeScopeTagsToMatch;
}
public ISharingLifetimeScope FindScope(ISharingLifetimeScope mostNestedVisibleScope)
{
if (mostNestedVisibleScope == null) throw new ArgumentNullException("mostNestedVisibleScope");
var next = mostNestedVisibleScope;
while (next != null)
{
if (_tagsToMatch.Contains(next.Tag))
return next;
next = next.ParentLifetimeScope;
}
return mostNestedVisibleScope.RootLifetimeScope;
}
}
Sadece proje için bu sınıfları ekleyin ve kayıt Bileşen olarak: Ben kendim denemedim
builder.RegisterType<A>.InstancePerMatchingOrRootLifetimeScope("TAG");
, ancak çalışması gerekir .
Neden buna ihtiyacınız var? Global kaydın kapsam kaydından farklı olmasını ister misiniz? Ya da yapılandırmalar, hem global kapsam hem de etiketli kapsam için aynı kalırken, tüketicilerin bir durumda bir örneği ve diğer durumlarda diğer örnekleri almasını ister misiniz? –
@PavelGatilov İkincisi. Aynı yapılandırma, etiketli kapsam başına farklı örnek ve genel kapsam için farklı örnek. –