2014-12-18 1 views
1

Прежде всего, извините за мой английский. Я пытаюсь сделать что-то маленькое в windsor + mvc. Я прочитал несколько руководств и искал любое решение моей проблемы, но я его не нашел. Использование:Замок Виндзор + ASP MVC 5 - System.MissingMethodException: не удается создать экземпляр интерфейса

  • VS 2013 Экспресс
  • ASP MVC 5.2.2 (.net 4.5)
  • Castle.Windsor 3.3.0 для .NETFramework v4.5

Я хочу построить модульное приложение (web + domain + db layer), но я все еще получаю ошибку:

Сведения об исключении: System.MissingMethodException: Невозможно создать экземпляр интерфейса.

Ошибка источника: Необработанное исключение было создано во время выполнения текущего веб-запроса. Информация о происхождении и местоположении исключения может быть идентифицирована с использованием следа стека исключений ниже.

Трассировка стека:

[MissingMethodException: Cannot create an instance of an interface.] 
    System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0 
    System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +159 
    System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +256 
    System.Activator.CreateInstance(Type type, Boolean nonPublic) +127 
    System.Activator.CreateInstance(Type type) +11 
    System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) +275 

[MissingMethodException: Cannot create an instance of an interface. Object type 'Dashboard.Web.Services.Interfaces.ITestApi'.] 
    System.Web.Mvc.DefaultModelBinder.CreateModel(ControllerContext controllerContext, ModelBindingContext bindingContext, Type modelType) +370 
    System.Web.Mvc.DefaultModelBinder.BindComplexModel(ControllerContext controllerContext, ModelBindingContext bindingContext) +151 
    System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor) +454 
    System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor) +153 
    System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__19(AsyncCallback asyncCallback, Object asyncState) +1449 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.Begin(AsyncCallback callback, Object state, Int32 timeout) +150 

..............

Основной класс или функция моего приложения (сейчас все в одном модуле/длл .web)

public class HomeController : Controller 
{ 
    public ActionResult Home(ITestApi test) 
    { 
     var result = test.Test(); 

     return View(); 
    } 
} 

ITestApi Интерфейс

namespace Dashboard.Web.Services.Interfaces 
{ 
    public interface ITestApi 
    { 
     string Test(); 
    } 
} 

TestApi Класс

namespace Dashboard.Web.Services.Implementation 
{ 
    public class TestApi : ITestApi 
    { 
     public string Test() 
     { 
      return "test"; 
     } 
    } 
} 

в Global.asax

private static void BootstrapContainer() { 
       Container = new WindsorContainer(); 
       Container.Install(FromAssembly.InThisApplication());    
       // Create the Controller Factory 
       var castleControllerFactory = new WindsorControllerFactory(Container); 
       // Add the Controller Factory into the MVC web request pipeline 
       ControllerBuilder.Current.SetControllerFactory(castleControllerFactory); 
      } 

Установщик

public class WebInstaller : IWindsorInstaller 
    { 
     public void Install(IWindsorContainer container, IConfigurationStore store) 
     { 
      container.Register(
       Classes.FromThisAssembly() 
       .BasedOn<IController>() 
       .LifestyleTransient() 
       ); 

      container.Register(
       Classes.FromThisAssembly() 
       .BasedOn<ITestApi>() 
       .LifestyleTransient() 
       ); 
     } 
    } 

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

container.Register(
       Classes.FromAssemblyInThisApplication() 
       .InSameNamespaceAs(typeof(ITestApi)) 
       //.WithServiceDefaultInterfaces() 
       .WithService.DefaultInterfaces() 
       .LifestyleTransient() 
       ); 

Может ли кто-нибудь мне помочь?

+0

Вы, кажется, делать что-то странное.Параметры в действиях контроллера mvc создаются связующим устройством MVC на основе формы, отправленной в действие или параметры строки запроса. Я не уверен, почему вы ожидаете, что замок добавит сюда экземпляр. Обычно вы вводите в конструктор контроллера не любой из его методов действия. –

ответ

0

Я не уверен, но я думаю, что вы просто регистрируюсь все классы, которые используют ITestApi против своего собственного имени, но вы никогда не говорите, что класс должен быть использован, когда CastleWindsor следует впрыснуть ITestApi

Замените ваш

 container.Register(
      Classes.FromThisAssembly() 
      .BasedOn<ITestApi>() 
      .LifestyleTransient() 
      ); 

с C# версии этого (к сожалению, имея только фрагмент кода VB.NET)

container.Register(Component.For(Of ITestApi).ImplementedBy(Of TestApi).LifestyleTransient()) 

 Смежные вопросы

  • Нет связанных вопросов^_^