Inversion of control 如何强制Castle Windsor TypedFactory中缺少参数的运行时错误

Inversion of control 如何强制Castle Windsor TypedFactory中缺少参数的运行时错误,inversion-of-control,castle-windsor,abstract-factory,Inversion Of Control,Castle Windsor,Abstract Factory,我正在使用CastleWindsor及其TypedFacility功能 我有一个由大约50个类组成的组,这些类派生自一个抽象基类。它们都有自己的接口。在加载时,我将具体类注册到接口 TypedFacility中有几个接口: T创建服务(字符串用户名) T创建 基类需要构造函数中的一个参数(用户名) 如果有人试图用create而不是CreateService创建一个需要用户名的类,我想显示一个运行时错误。还有什么我可以做的吗?你可以这样尝试: Component.For<ITypedFa

我正在使用CastleWindsor及其TypedFacility功能

我有一个由大约50个类组成的组,这些类派生自一个抽象基类。它们都有自己的接口。在加载时,我将具体类注册到接口

TypedFacility中有几个接口:

  • T创建服务(字符串用户名)
  • T创建
  • 基类需要构造函数中的一个参数(用户名)


    如果有人试图用create而不是CreateService创建一个需要用户名的类,我想显示一个运行时错误。还有什么我可以做的吗?

    你可以这样尝试:

      Component.For<ITypedFactoryComponentSelector>().ImplementedBy<MyServicesTypedFactorySelector>(),
    
    Component.For().ImplementedBy(),
    
    在选择器中有类型和参数:

    public class MyServicesTypedFactorySelector : ITypedFactoryComponentSelector
    {
        public Func<IKernelInternal, IReleasePolicy, object> SelectComponent(MethodInfo method, Type type, object[] arguments)
        {
            string username = arguments.Length > 0 ? (string)arguments[0] : null;
            var parameterlessConstructor = theType.GetConstructor(Type.EmptyTypes);
            //if there is no parameterless ctor and string.IsNullOrEmpty(username) 
            // throw InvalidOperationException($"no username provided for {type.GetName().Name}");
    
            ....
        }   
    }
    
    公共类MyServicesTypedFactorySelector:ITypedFactoryComponentSelector
    {
    public Func SelectComponent(MethodInfo方法、类型、对象[]参数)
    {
    字符串用户名=参数。长度>0?(字符串)参数[0]:null;
    var parameterlessConstructor=Type.GetConstructor(Type.EmptyTypes);
    //如果没有无参数的ctor和string.IsNullOrEmpty(用户名)
    //抛出InvalidOperationException($“没有为{type.GetName().Name}提供用户名”);
    ....
    }   
    }
    
    您可以这样尝试:

      Component.For<ITypedFactoryComponentSelector>().ImplementedBy<MyServicesTypedFactorySelector>(),
    
    Component.For().ImplementedBy(),
    
    在选择器中有类型和参数:

    public class MyServicesTypedFactorySelector : ITypedFactoryComponentSelector
    {
        public Func<IKernelInternal, IReleasePolicy, object> SelectComponent(MethodInfo method, Type type, object[] arguments)
        {
            string username = arguments.Length > 0 ? (string)arguments[0] : null;
            var parameterlessConstructor = theType.GetConstructor(Type.EmptyTypes);
            //if there is no parameterless ctor and string.IsNullOrEmpty(username) 
            // throw InvalidOperationException($"no username provided for {type.GetName().Name}");
    
            ....
        }   
    }
    
    公共类MyServicesTypedFactorySelector:ITypedFactoryComponentSelector
    {
    public Func SelectComponent(MethodInfo方法、类型、对象[]参数)
    {
    字符串用户名=参数。长度>0?(字符串)参数[0]:null;
    var parameterlessConstructor=Type.GetConstructor(Type.EmptyTypes);
    //如果没有无参数的ctor和string.IsNullOrEmpty(用户名)
    //抛出InvalidOperationException($“没有为{type.GetName().Name}提供用户名”);
    ....
    }   
    }
    
    当“有人试图创建类”时,您确定要“编译错误”吗?您可以尝试在两个接口后面创建两个TypedFactory,并避免这种情况。否则,您可以在FactoryMethod中执行。您确定在“有人试图创建类”时需要“编译错误”吗?您可以尝试在两个接口后面创建两个TypedFactory,并避免这种情况。否则,您可以在FactoryMethod中执行此操作。