Tôi nghĩ bạn nên mở rộng Autofac bằng cách giới thiệu một lựa chọn cuộc đời mới. Tôi đã lấy nguồn Autofac và sửa đổi chúng một chút:
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;
}
}
Chỉ cần thêm các lớp này để dự án của bạn và đăng ký bạn thành phần như:
builder.RegisterType<A>.InstancePerMatchingOrRootLifetimeScope("TAG");
Tôi đã không thử nó bản thân mình, nhưng nó phải làm việc .
Nguồn
2013-02-06 05:58:07
Tại sao bạn cần điều này? Bạn có muốn đăng ký toàn cầu khác với đăng ký phạm vi không? Hay bạn muốn người tiêu dùng nhận được một ví dụ trong một trường hợp và các trường hợp khác trong các trường hợp khác, trong khi các cấu hình vẫn giữ nguyên cho cả phạm vi toàn cầu và phạm vi được gắn thẻ? –
@PavelGatilov Sau đó. Cùng một cấu hình, trường hợp khác nhau cho mỗi phạm vi được gắn thẻ và thể hiện khác nhau cho phạm vi toàn cầu. –