Dependency injection 企业库-从ParameterValue表达式获取值

Dependency injection 企业库-从ParameterValue表达式获取值,dependency-injection,unity-container,enterprise-library,ioc-container,Dependency Injection,Unity Container,Enterprise Library,Ioc Container,我正在尝试将企业库TypeRegistration构造函数参数转换为密钥/值对的集合(通常是哈希表或IDictionary) ConstructorParameters属性是IEnumerableOf(ParameterValue),所以我的问题是如何从每个ParameterValue对象中提取值 每个ParameterValue对象都包含一个类型和一个表达式 例如,如果参数值包含:“EventLoggingEnabled=false” 然后我可以使用expression.Member.Name

我正在尝试将企业库TypeRegistration构造函数参数转换为密钥/值对的集合(通常是哈希表或IDictionary)

ConstructorParameters属性是IEnumerableOf(ParameterValue),所以我的问题是如何从每个ParameterValue对象中提取值

每个ParameterValue对象都包含一个类型和一个表达式

例如,如果参数值包含:“EventLoggingEnabled=false” 然后我可以使用expression.Member.Name获取密钥(即EventLoggingEnabled) 但是我找不到一种方法来获取值(它是“false”)


有什么想法吗?

当表达式不可解析时,此方法有效

    var dependencies = new Hashtable();

        foreach (ParameterValue pv in constructorParameters)
        {
            MemberExpression exp = pv.Expression as MemberExpression;
            if (exp != null)
            {
                String key = exp.Member.Name;
                Object val = GetValue(exp);

                dependencies.Add(key, val);
            }
        }

    // ...

    private Object GetValue(MemberExpression member)
    {
        var objectMember = Expression.Convert(member, typeof(Object));
        var getterLambda = Expression.Lambda<Func<Object>>(objectMember);

        return getterLambda.Compile().Invoke();
    }
var dependencies=newhashtable();
foreach(构造函数参数中的参数值pv)
{
MemberExpression=pv.Expression作为MemberExpression;
如果(exp!=null)
{
字符串键=exp.Member.Name;
对象值=获取值(exp);
添加(key,val);
}
}
// ...
私有对象GetValue(MemberExpression成员)
{
var objectMember=Expression.Convert(成员,typeof(对象));
var getterLambda=Expression.Lambda(objectMember);
返回getterLambda.Compile().Invoke();
}

您看过UnityContainerConfiguration的实现吗?即使您不想使用Unity,您也可以看到类型注册是如何处理的,并适应Windsor API

您通常不需要对原始ParameterValue类进行编码,也不需要遍历lambda表达式。实际上有三个子类:

  • 常数参数值
  • 容器溶解参数计
  • 容器溶出量参数计
ConstantParameterValue直接将该值作为.value属性提供给您。ContainerResolvedParameter在容器需要注入参数值时使用,ContainerResolvedNumerableParameter在需要注入集合时使用。ParameterValue的每个实例实际上都是这些类型之一

因此,您应该尝试对每个类型进行强制转换,然后根据实际类型进行切换。有一个实用程序基类ParameterValueVisitor,它允许您在ParameterValues上实现访问者模式,从而使代码更干净


所以,我要做的是通过lambdas放弃采摘-你不需要这样做。使用基类实现一个访问者来提取您需要的信息,然后预消化的信息将在具体的类中提供给您。查看UnityContainerConfigurator以了解如何完成此操作。

我想澄清一点-类型注册特定于企业库,而不是特定于Unity。是的,这是正确的(因为我第一次看到API,所以错过了它)。我更正了问题的标题(和信息)。我一定会听从你的建议,谢谢。(在那个特定的项目中,我不能从温莎切换到Unity,但这并不意味着我不喜欢它。)再次感谢您的回复。好的,我得到了我的前两个积分测试,通过(或绿色!)积分测试!!这是我到目前为止所做的,