Замок Виндзор BuildUp - PullRequest
       0

Замок Виндзор BuildUp

3 голосов
/ 08 ноября 2010

Имеет ли Castle Windsor эквивалентный BuildUp () Unity, в соответствии с которым вы можете украшать свойства класса атрибутами, и контейнер передает значения в существующий экземпляр объекта?

например. в единстве:

Statistics existingInstance = new Statistics();  
container.BuildUp(existingInstance)

class Statistics  
{  
  [Dependency]  
  public ICalculator Calculator { get; set; }  

Ответы [ 2 ]

3 голосов
/ 01 мая 2013

Однако вы можете закодировать эту функцию самостоятельно.Например, вот ASP.NET MVC FilterAttributeFilterProvider, используемый для внедрения свойств в фильтры действий атрибутов.

  public class AttributeFilterProvider : FilterAttributeFilterProvider
  {
    public AttributeFilterProvider(IKernel kernel)
    {
      _kernel = kernel;
    }

    private readonly IKernel _kernel;

    protected override IEnumerable<FilterAttribute> GetControllerAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
    {
      var attributes = base.GetControllerAttributes(controllerContext, actionDescriptor);
      BuildUpAttributeDependancies(attributes);
      return attributes;
    }

    protected override IEnumerable<FilterAttribute> GetActionAttributes(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
    {
      var attributes = base.GetActionAttributes(controllerContext, actionDescriptor);
      BuildUpAttributeDependancies(attributes);
      return attributes;
    }

    private void BuildUpAttributeDependancies(IEnumerable<FilterAttribute> attributes)
    {
      foreach (var attribute in attributes)
      {
        var propInfos = attribute.GetType().GetProperties().Where(x => x.GetValue(attribute) == null).AsEnumerable();
        foreach (var pi in propInfos)
        {
          if (_kernel.HasComponent(pi.PropertyType))
          {
            var service = _kernel.Resolve(pi.PropertyType);
            pi.SetValue(attribute, service);
          }
        }
      }
    }
  }

В методе BuildUpAttributeDependancies мы ищем неинициализированные (нулевые) свойства, а затем проверяемпосмотреть, был ли тип зарегистрирован в замке Виндзор.Если это так, мы устанавливаем свойство.

Заменив фильтр FilterAttributeFilterProvider по умолчанию на наш собственный (выше) в файле global.asax, теперь мы можем использовать функции DI Castle Windsors для добавления любого типа в любой фильтр действий внаше приложение MVC.Чтобы завершить этот ответ полностью, вот пример класса приложения global.asax с настройкой Castle Windsor для внедрения зависимости (Controller (во время создания экземпляра)) и ActionFilter (во время использования):

public class MvcApplication : System.Web.HttpApplication
{
  private static IWindsorContainer _container;

  private static void BootstrapContainer()
  {
    _container = new WindsorContainer()
        .Install(FromAssembly.This());

    var controllerFactory = new ControllerFactory(_container.Kernel);
    ControllerBuilder.Current.SetControllerFactory(controllerFactory);
  }

  private static void BootstrapFilters()
  {
    var oldProvider = FilterProviders.Providers.Single(f => f is FilterAttributeFilterProvider);
    FilterProviders.Providers.Remove(oldProvider);

    var provider = new AttributeFilterProvider(_container.Kernel);
    FilterProviders.Providers.Add(provider);
  }

  protected void Application_Start()
  {
    AreaRegistration.RegisterAllAreas();

    WebApiConfig.Register(GlobalConfiguration.Configuration);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    BootstrapContainer();
    BootstrapFilters();
  }
}
1 голос
/ 08 ноября 2010

похоже, что ответ заключается в том, что Castle Windsor не может внедрить зависимости в существующий экземпляр объекта ни по атрибутам, ни по методу внедрения:

Дублирование Вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...