代码之家  ›  专栏  ›  技术社区  ›  the_drow

用WinsdorContainer初始化类型时出现问题

  •  0
  • the_drow  · 技术社区  · 15 年前
        public ApplicationView(string[] args)
        {
            InitializeComponent();
    
            string configFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log4net.config");
            FileInfo configFileInfo = new FileInfo(configFilePath);
            XmlConfigurator.ConfigureAndWatch(configFileInfo);
    
            IConfigurationSource configSource = ConfigurationManager.GetSection("ActiveRecord") as IConfigurationSource;
            Assembly assembly = Assembly.Load("Danel.Nursing.Model");
            ActiveRecordStarter.Initialize(assembly, configSource);         
    
            WindsorContainer windsorContainer = ApplicationUtils.GetWindsorContainer();
            windsorContainer.Kernel.AddComponentInstance<ApplicationView>(this);
            windsorContainer.Kernel.AddComponent(typeof(ApplicationController).Name, typeof(ApplicationController));
            controller = windsorContainer.Resolve<ApplicationController>(); // exception is thrown here
    
            OnApplicationLoad(args);
        }
    

    堆栈跟踪如下:

    Castle.MicroKernel.ComponentActivator.ComponentActivator异常 未处理
    实例化
    堆栈跟踪: (签名) 上下文) 在Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.InternalCreate(CreationContext)中 上下文) 位于Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.Create(CreationContext 在Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.Resolve(CreationContext)中 上下文) 上下文) 位于Castle.MicroKernel.Handlers.DefaultHandler.Resolve(CreationContext 上下文) 位于Castle.MicroKernel.Resolvers.DefaultDependencyResolver.ResolveServiceDependency(CreationContext 上下文,组件模型, 依赖关系(模型依赖关系) 上下文,ISubDependencyResolver parentResolver,ComponentModel, 依赖关系(模型依赖关系) 构造函数,CreationContext上下文, 键入[]和;(签名) 在Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.Instantiate(CreationContext)中 在Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.InternalCreate(CreationContext)中 上下文) 位于Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.Create(CreationContext 上下文) 在Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.Resolve(CreationContext)中 在Castle.MicroKernel.Lifestyle.SingletonLifestyleManager.Resolve(CreationContext)中 位于Castle.MicroKernel.Handlers.DefaultHandler.Resolve(CreationContext 上下文) 位于Castle.MicroKernel.Resolvers.DefaultDependencyResolver.ResolveServiceDependency(CreationContext 上下文,组件模型, 依赖关系(模型依赖关系) 上下文,ISubDependencyResolver parentResolver,ComponentModel, 依赖关系(模型依赖关系) 构造函数,CreationContext上下文, 键入[]和;(签名) 在Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.InternalCreate(CreationContext)中 上下文) 位于Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.Create(CreationContext 在Castle.MicroKernel.Lifestyle.AbstractLifestyleManager.Resolve(CreationContext)中 上下文) 上下文) 上下文) 位于Castle.MicroKernel.Resolvers.DefaultDependencyResolver.ResolveServiceDependency(CreationContext 依赖关系(模型依赖关系) 在Castle.MicroKernel.Resolvers.DefaultDependencyResolver.Resolve(CreationContext)中 上下文,ISubDependencyResolver parentResolver,ComponentModel, 依赖关系(模型依赖关系) 位于Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateConstructorArguments(ConstructorCandidate 构造函数,CreationContext上下文, 在Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.Instantiate(CreationContext)中 在Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.InternalCreate(CreationContext)中 上下文) 位于Castle.MicroKernel.ComponentActivator.AbstractComponentActivator.Create(CreationContext 上下文) 在Castle.MicroKernel.Lifestyle.SingletonLifestyleManager.Resolve(CreationContext)中 上下文) 上下文) 在Castle.MicroKernel.DefaultKernel.ResolveComponent(IHandler 处理程序,类型服务,IDictionary 附加参数) 在Castle.MicroKernel.DefaultKernel.ResolveComponent(IHandler 在Castle.MicroKernel.DefaultKernel.get\项(键入 服务) 在Castle.Windsor.WindsorContainer.Resolve(键入 在Castle.Windsor.WindsorContainer.ResolveT args)输入 E:\Agile\Scheduling\Danel.Nursing.Scheduling\ApplicationView.cs:行 65 在Danel.Nursing.Scheduling.Program.Main(字符串[]) args)输入 E:\Agile\Scheduling\Danel.Nursing.Scheduling\Program.cs:行 在System.AppDomain.\u nExecuteAssembly(程序集 程序集,字符串[]args) 在System.AppDomain.ExecuteAssembly(字符串 位于Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在System.Threading.ThreadHelper.ThreadStart\u上下文(对象 (州) executionContext、ContextCallback 回调,对象状态) 位于System.Threading.ThreadHelper.ThreadStart() 内部异常: System.ArgumentNullException异常 Source=“mscorlib” ParamName=“类型” 堆栈跟踪: bindingAttr,活页夹,类型[] 类型,ParameterModifier[]修饰符) 在Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.FastCreateInstance(类型 implType,Object[]参数,Type[] (签名) 位于Castle.MicroKernel.ComponentActivator.DefaultComponentActivator.CreateInstance(CreationContext 上下文,对象[]参数,类型[] (签名) 内部异常:

    这是它抱怨的concreate类型:

       namespace Danel.Nursing.Scheduling.Actions.DataServices
        {
            using System;
            using Helpers;
            using Rhino.Commons;
            using Danel.Nursing.Model;
            using NHibernate.Expressions;
            using System.Collections.Generic;
            using DateUtil = Danel.Nursing.Scheduling.Actions.Helpers.DateUtil;
            using Danel.Nursing.Scheduling.Actions.DataServices.Interfaces;
    
            public class NurseAbsenceDataService : AbstractDataService<NurseAbsence>, INurseAbsenceDataService
            {
                NurseAbsenceDataService(IRepository<NurseAbsence> repository)
                    : base(repository)
                {
                }
    
                //...
            }
        }
    

    AbstractDataService暂时只保留IRepository。 有人知道为什么会抛出异常吗?

    编辑:
    问题在于:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Danel.Nursing.Scheduling.Actions.Interfaces;
    using Rhino.Commons;
    using System.Reflection;
    using Castle.Windsor;
    
    namespace Danel.Nursing.Scheduling.Actions.Helpers
    {
        public class DataServicesInitiator : IDataServicesInitiator
        {
            public void AddToIocContainer(ref WindsorContainer windsorContainer)
            {
                if (windsorContainer.Kernel.HasComponent(typeof(IRepository<>)) == false)
                    windsorContainer.AddComponent(typeof(ARRepository<>).FullName, typeof(IRepository<>), typeof(ARRepository<>));
                foreach (Type type in Assembly.Load("Danel.Nursing.Scheduling.Actions").GetTypes())
                {
                    if (type == null)
                        continue;
    
                    if (type.Namespace != "Danel.Nursing.Scheduling.Actions.DataServices")
                        continue;
    
                    if (type.IsAbstract || type.IsInterface)
                        continue;
    
                    if (windsorContainer.Kernel.HasComponent(type.FullName))
                        continue;
    
                    if (type.GetInterfaces().Length == 0)
                        windsorContainer.AddComponent(type.FullName, type);
                    else
                        windsorContainer.AddComponent(type.FullName, type.GetInterfaces()[0], type);
                }
            }
        }
    }
    

    由于某些原因,type为null,尽管GetTypes不返回null类型。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Krzysztof Kozmic    15 年前

    内部异常说明了什么?类型的构造函数似乎抛出了异常,或者由于其他原因无法正确调用构造函数。。。

    更新

    通过下载 ActiveRecord package . 一切都在那里。

    如果你 不要 想要更新,您可以采取另一种方法-为此组件编写一个自定义激活器(从默认激活器继承并重写暴露bug的方法) 这应该是最安全的解决方法。