Dependency injection 企业库-从ParameterValue表达式获取值
我正在尝试将企业库TypeRegistration构造函数参数转换为密钥/值对的集合(通常是哈希表或IDictionary) ConstructorParameters属性是IEnumerableOf(ParameterValue),所以我的问题是如何从每个ParameterValue对象中提取值 每个ParameterValue对象都包含一个类型和一个表达式 例如,如果参数值包含:“EventLoggingEnabled=false” 然后我可以使用expression.Member.Name获取密钥(即EventLoggingEnabled) 但是我找不到一种方法来获取值(它是“false”)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
有什么想法吗?当表达式不可解析时,此方法有效
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表达式。实际上有三个子类:
- 常数参数值
- 容器溶解参数计
- 容器溶出量参数计
所以,我要做的是通过lambdas放弃采摘-你不需要这样做。使用基类实现一个访问者来提取您需要的信息,然后预消化的信息将在具体的类中提供给您。查看UnityContainerConfigurator以了解如何完成此操作。我想澄清一点-类型注册特定于企业库,而不是特定于Unity。是的,这是正确的(因为我第一次看到API,所以错过了它)。我更正了问题的标题(和信息)。我一定会听从你的建议,谢谢。(在那个特定的项目中,我不能从温莎切换到Unity,但这并不意味着我不喜欢它。)再次感谢您的回复。好的,我得到了我的前两个积分测试,通过(或绿色!)积分测试!!这是我到目前为止所做的,