Зачем использовать наращивание с Unity для DI

#c# #dependency-injection #unity-container

#c# #внедрение зависимостей #unity-контейнер

Вопрос:

Я пытаюсь понять, почему / когда я буду использовать метод наращивания контейнера Unity. Если у меня есть следующее:

 [TestInitialize]
public void SetupEnvironment()
{
    var container = new UnityContainer();
    container.RegisterType<ILocalizingKeyHolder, FeeTypeKeyHolder>(
        typeof(FeeType).Name);    
    var keyHolderFactory = new UnityLocalizingKeyHolderFactory(container);
    var ctx = new TspDbContext(keyHolderFactory);
    ...
}
 

И я вызываю keyHolderFactory в моем DAL, когда я материализую объект через EF:

 public override void OnObjectMaterialized(object entity)
{
    var localizableEntity = (entity as ILocalizableEntity);
    if (localizableEntity != null)
    {
        this.KeyHolderFactory.AttachKeyHolder(localizableEntity);
    }
}
 

И keyHolderFactory реализован следующим образом:

 public class UnityLocalizingKeyHolderFactory : ILocalizingKeyHolderFactory
{
    private UnityContainer Container { get; set; }

    public UnityLocalizingKeyHolderFactory(UnityContainer container)
    {
        this.Container = container;
    }

    public void AttachKeyHolder(ILocalizableEntity localizableEntity)
    {
        localizableEntity.KeyHolder = Container.Resolve<ILocalizingKeyHolder>(
            localizableEntity.GetType().Name);
        localizableEntity.UpdateLocalizingKey();
    }
}
 

Я действительно не вижу, какая польза от использования BuildUp для внедрения LocalizingKeyHolder в объект?

Это

 localizableEntity.KeyHolder =
    Container.Resolve<ILocalizingKeyHolder>(localizableEntity.GetType().Name);
 

кажется достаточно простым. Итак:

  1. Является ли BuildUp просто формой синтаксического сахара, при которой, если бы у меня было несколько свойств для разрешения типов, я мог бы просто использовать одну строку кода, чтобы это произошло, вместо того, чтобы разрешать один раз для каждого свойства?
  2. Должен ли я добавлять атрибут зависимости к каждому свойству, которое я хочу создать?
  3. Могу ли я использовать именованные регистрации с BuildUp?
  4. Какие еще преимущества есть в использовании Buildup?

Комментарии:

1. Использование BuildUp для подключения объектов, не созданных контейнером

2. @George — Спасибо. Я понимаю это, но тогда зачем вообще его использовать, поскольку мне все равно нужно передать его в контейнер, что еще для меня делает BuildUp, чего я не сделал выше?