2013-08-28 71 views
0

我试图解决对象,继承模板类在温莎城堡解决仿制药

using System; 
using Controller; 

namespace Controller 
{ 
    public interface IControllerBase<T> where T:IViewBase 
    { 

    } 

    public class ControllerBase 
    { 
     public string ModuleName 
     { 
      get; 
      set; 
     } 
    } 

    public class ControllerBase<T> : ControllerBase, IControllerBase<T> 
     where T : IViewBase 
    { 

     public virtual T View { 
      get; 
      set; 
     } 

     public ControllerBase (T instance) 
     { 
      View = instance; 
     } 
    } 

    } 



IControllerBase was added recently, just to match this strategy: 

    container.Register (Component.For(typeof(IControllerBase<IViewBase>)).ImplementedBy(typeof(ControllerBase<IViewBase>)).LifeStyle.Transient); 

下一个我有一个从ControllerBase

using System; 

namespace HardwareConnections 
{ 
    public class HardwareConnectionsController : Controller.ControllerBase<IHardwareConnections> 
    { 
     public HardwareConnectionsController(IHardwareConnections view) : base(view) 
     { 
      base.ModuleName = "Hardware connections"; 
      Console.WriteLine("\n\n\n\n"); 
      Console.WriteLine("Constructor fired"); 
      Console.WriteLine("\n\n\n\n"); 
     } 
    } 
} 

我试图通过解决HardwareConnectionsController derrived类首先解析实现IViewBase接口的View类,这工作正常,我得到一个视图的实例,并在构造函数中传递它

但我有解决Controller类问题

var hcon = container.Resolve<ControllerBase<IViewBase>>(new { view = plug}); 

错误是:

Castle.MicroKernel.ComponentNotFoundException已经扔 支持服务PETController.ControllerBase`1 [PETController.IViewBase,PETController,版本号成分= 1.0.4988.28227文化=中性公钥=空]发现 堆栈:

Castle.MicroKernel.ComponentNotFoundException: No component for supporting the service PETController.ControllerBase`1[[PETController.IViewBase, PETController, Version=1.0.4988.28227, Culture=neutral, PublicKeyToken=null]] was found 
    at Castle.MicroKernel.DefaultKernel.Castle.MicroKernel.IKernelInternal.Resolve (System.Type service, IDictionary arguments, IReleasePolicy policy) [0x00000] in <filename unknown>:0 
    at Castle.MicroKernel.DefaultKernel.Resolve (System.Type service, IDictionary arguments) [0x00000] in <filename unknown>:0 
    at Castle.Windsor.WindsorContainer.Resolve[ControllerBase`1] (System.Object argumentsAsAnonymousType) [0x00000] in <filename unknown>:0 
    at (wrapper remoting-invoke-with-check) Castle.Windsor.WindsorContainer:Resolve (object) 
    at PETController.PluginFactory.LoadPlugins[IViewBase] (System.String searchLocation) [0x001f6] in /home/konrad/hg/PET/PET/PETController/Utils/PluginFactory.cs:67 
    at MainWindow..ctor() [0x00034] in /home/konrad/hg/PET/PET/PETController/MainWindow.cs:19 
    at PETController.MainClass.Main (System.String[] args) [0x00005] in /home/konrad/hg/PET/PET/PETController/Main.cs:11 


enter code here 

回答

1

我是一个有点困惑关于你的样......但总体来讲,如果你注册了一个组件For(typeof(IControllerBase<IViewBase>))你必须使用相同的类型解决它。的

代替

var hcon = container.Resolve<ControllerBase<IViewBase>>(new { view = plug}); 

尝试

var hcon = container.Resolve<IControllerBase<IViewBase>>(new { view = plug}); 

我不知道为什么要注册使用与实施通用型的,而不是真正的一个组件......这就是我可能改用

container.Register (Component.For(typeof(IControllerBase<IViewBase>)).ImplementedBy(typeof(HardwareConnectionsController)).LifeStyle.Transient); 
0

继承人一些可能有所帮助的东西:

当您注册尝试(我认为这是你在找什么):

container.Register (Component.For(typeof(IControllerBase<>)).ImplementedBy(typeof(ControllerBase<>)).LifeStyle.Transient); 

当你解决,你需要使用IControllerBase而不是ControllerBase:

var hcon = container.Resolve<IControllerBase<IViewBase>>(new { view = plug}); 

如果您注册服务IControllerBase <>您需要解析IControllerBase