У меня есть приложение, смоделированное от 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