"Withctorarg" "EqualTo"및 Nullable 유형의 StructureMap
-
10-07-2019 - |
문제
StructureMap은 구조적 인수로 무효 유형을 통과하는 것을 좋아하지 않습니다. 이에 대한 이유가 있습니까? 이것을 작동시키는 방법이 있습니까?
[TestMethod]
public void Demo()
{
ObjectFactory.Initialize(x => x.ForRequestedType<TestClass>()
.TheDefault.Is.OfConcreteType<TestClass>()
.WithCtorArg("param1").EqualTo((byte?)3));
//This fails, but works if it's non-nullable
var result = ObjectFactory.GetInstance<TestClass>();
}
public class TestClass
{
public TestClass(byte? param1)
{ }
}
해결책
근본적인 문제는 CLR의 관점과 차이가 없다는 것입니다. Object
) nullable 유형의 인스턴스 및 동등하지 않은 유형의 (비스듬한) 인스턴스. 마찬가지로, 당신이 nullable 유형과 같은 gettype ()를 호출 할 때 int?
, 반환 된 유형은 규칙과 구별 할 수 없습니다 int
. 보다 http://msdn.microsoft.com/en-us/library/ms366789.aspx 이것에 대한 자세한 정보.
이 동작은 객체 유형 매개 변수에서 gettype ()를 사용하여 유형을 심문하는 Structuremap과 같은 코드의 재난에 대한 레시피입니다. StructureMap은 귀하의 여부를 알지 못하기 때문입니다 byte?
실제로는 무일치 할 수 없습니다. 구조적 코드-생성자가 생성자 호출을 할 때는 규칙적으로 코드-겐을 만들어냅니다. byte
, StructureMap이 잘못된 유형을 생성자 호출로 전달한 이후로 런타임에 폭탄이 발생합니다.
StructureMap이이를 해결할 수는 있지만 변경 사항은 사소한 일입니다. 나는 StructureMap 소스 코드 (예 : Object and GetType () 사용에서 대신 일반적인 매개 변수 유형을 수락 한 일반적인 방법을 사용하는 것으로 변경 한 다음 무효 유형인지 아닌지 확인할 수있는 몇 가지 조정을 시도했습니다. 더 많은 변화가 필요했고 (생성자 호출을하는 데 필요한 IL 생성에 Afaik을 포함하여), 나는 포기했습니다.
코드를 가장 잘 알고있는 구조지도 팀 자체로이를 제기 할 수 있습니다. 그만큼 Google Group의 StructureMap 시작하기에 합리적인 장소입니다. 귀하의 질문은 전에 묻습니다 (끝을 참조하십시오. 이 게시물) 그래서 Google 그룹이 얼마나 반응이 있는지 잘 모르겠습니다.
그러나 구조 맵 자체에서 수정을 제외하고, 내가 당신이라면, 당신의 클래스를 단순한 래퍼로 감싸는 것을 고려하여 생성자의 무효가 가능한 매개 변수가 필요합니다.
또는 당신이 용감하다고 느끼면, 당신은 얻어서 이것을 고칠 수 있습니다 매우 StructureMap 소스 코드에 익숙합니다. :-)
BTW, 다음은 구조 맵 소스에서 문제가 발생하는 한 가지 예입니다.
/// <summary>
/// Sets the value of the constructor argument
/// </summary>
/// <param name="propertyValue"></param>
/// <returns></returns>
public T EqualTo(object propertyValue)
{
if(propertyValue.GetType().IsSimple())
_instance.SetProperty(_propertyName, propertyValue.ToString());
else
{
_instance.SetChild(_propertyName,new LiteralInstance(propertyValue));
}
return (T) _instance;
}
PropertyValue 인수를 객체로 변환함으로써 방법이 무효 유형이라는 것을 알 수는 없습니다. byte?
그리고 byte
한 번은 물체로 변환 된 구별 할 수 없습니다.
다른 팁
이 코드는 StructureMap 소스에서 발견되었습니다. 무효 유형을 포함하지 않는 것 같습니다.
protected internal bool IsSimple(Type type)
{
return type.IsPrimitive || IsString(type) || IsEnum(type);
}