Я играл с парой DI-контейнеров, и мне нравится TinyIoC. Впервые я познакомился с ним через Nancy/fx.
Я пытаюсь использовать его в текущем проекте MVC, но не могу заставить его создавать экземпляры контроллеров, которые содержат параметры интерфейса в конструкторе.
Насколько я понимаю, это должно быть прямолинейно. Он даже поставляется с методом AutoRegister, который обеспечивает базовую регистрацию. Я реализовал IControllerFactory, который позволяет мне переопределить DefaultControllerFactory для MVC, который просто создает экземпляры контроллеров, кстати, он не выполняет и DI.
Я также реализовал IDependancyResolver для использования TinyIoC. Но создание экземпляров контроллеров не работает. У вас есть пример кода, который я вижу, который иллюстрирует, как использовать его для создания экземпляров контроллеров с помощью TinyIoC?
Вот что у меня есть до сих пор.
КонтроллерЗаводской код
public class TinyIoCControllerFactory : IControllerFactory
{
private readonly TinyIoCContainer _container;
public TinyIoCControllerFactory(TinyIoCContainer container)
{
_container = container;
}
public IController CreateController(RequestContext requestContext, string controllerName)
{
return (_container.CanResolve<IController>(controllerName))
? _container.Resolve<IController>(controllerName)
: null;
}
public SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName)
{
return SessionStateBehavior.Default;
}
public void ReleaseController(IController controller)
{
var disposeable = (IDisposable) controller;
if (disposeable == null) return;
disposeable.Dispose();
}
}
Код DependencyResolver
public class TinyIoCResolver : IDependencyResolver
{
private readonly TinyIoCContainer _container;
public TinyIoCResolver(TinyIoCContainer container)
{
_container = container;
}
public object GetService(Type serviceType)
{
return _container.Resolve(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return _container.ResolveAll(serviceType, true);
}
}
Регистрационный код
public static void RegisterContainer(TinyIoCContainer container)
{
ControllerInstaller.Install(container);
RepositoryInstaller.Install(container);
container.Register<IControllerFactory>(new TinyIoCControllerFactory(container));
DependencyResolver.SetResolver(new TinyIoCResolver(container));
}
public static void Install(TinyIoCContainer container)
{
container.Register<ISomeDBContext, SomeDbContext>();
container.Register<ISomeRepository, SomeRepository>();
}
public static void Install(TinyIoCContainer container)
{
container.Register<IController, HomeController>();
container.Register<IController, TestController>();
}
Нужно ли использовать метод UsingConstructor() для принудительного создания экземпляра? Если да, то как мне его использовать?
Вот снимок ошибки только для домашнего контроллера, у которого нет параметров конструктора.
Сообщение об ошибке одинаково для контроллеров с аргументами. Конечным результатом является то, что контроллеры не создаются.
Спасибо, Тим.