ASP.NET MVC Использование замка Виндзор IoC - PullRequest
2 голосов
/ 18 сентября 2009

У меня есть приложение, смоделированное от Apress Pro ASP.NET MVC, которое использует IoC замка Виндзора для создания экземпляров контроллеров с их соответствующими репозиториями, и это прекрасно работает

например.

public class ItemController : Controller
{
    private IItemsRepository itemsRepository;
    public ItemController(IItemsRepository windsorItemsRepository)
    {
        this.itemsRepository = windsorItemsRepository;
    }

с

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Castle.Windsor;
using Castle.Windsor.Configuration.Interpreters;
using Castle.Core.Resource;
using System.Reflection;
using Castle.Core;

namespace WebUI
{
    public class WindsorControllerFactory : DefaultControllerFactory
    {
        WindsorContainer container;

        // The constructor:
        // 1. Sets up a new IoC container
        // 2. Registers all components specified in web.config
        // 3. Registers all controller types as components
        public WindsorControllerFactory()
        {
            // Instantiate a container, taking configuration from web.config
            container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));

            // Also register all the controller types as transient
            var controllerTypes = from t in Assembly.GetExecutingAssembly().GetTypes()
                                  where typeof(IController).IsAssignableFrom(t)
                                  select t;
            foreach (Type t in controllerTypes)
                container.AddComponentWithLifestyle(t.FullName, t, LifestyleType.Transient);
        }

        // Constructs the controller instance needed to service each request
        protected override IController GetControllerInstance(Type controllerType)
        {
            return (IController)container.Resolve(controllerType);
        }
    }
}

управление созданием контроллера.

Иногда мне нужно создать другие экземпляры репозитория в контроллерах, чтобы собирать данные из других мест, могу ли я сделать это с помощью CW IoC, если да, то как?

Я занимался созданием новых классов контроллеров, так как они должны автоматически регистрироваться в моем существующем коде (если я могу заставить это работать, я могу зарегистрировать их позже), но когда я пытаюсь создать их экземпляр, есть очевидное возражение, так как я не могу предоставить класс репозитория для конструктора (я был почти уверен, что это был неправильный путь в любом случае).

Любая помощь (особенно примеры) будет высоко ценится. ура MH

Ответы [ 2 ]

5 голосов
/ 21 сентября 2009

Просто объявите ваши необходимые зависимости в конструкторе вашего контроллера, т.е.

public class MyController: Controller {
  private readonly IItemsRepository itemsRepo;
  private readonly IPersonRepository personRepo;
  public MyController(IItemsRepository i, IPersonRepository p) {
    itemsRepo = i;
    personRepo = p;
  }
}

Windsor разрешит зависимости автоматически при создании экземпляра контроллера.

В коде Google есть много проектов, которые вы можете использовать в качестве руководства, например WineCellarManager .

Кстати: вам не нужно кодировать свой собственный WindsorControllerFactory, вы можете получить это (и многое другое) из MVCContrib

1 голос
/ 04 ноября 2010

он больше не работает с последней версией виндорского замка, на самом деле, сборка микроядра внутри замка таяла. Ядро

...