문제

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);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top