DapperExtension ClassMapper 서브 클래스를 어떻게 사용하도록 등록합니까?

c# dapper dapper-extensions

문제

DapperExtensions로 시작했는데 매우 기대됩니다. 그러나 ClassMapper 하위 클래스 등록을 처리하는 방법에 대해 혼란스러워합니다.

나는 둘 다 Custom PluralizedAutoClassMapper와 정규 ClassMapper를 가지고 있는데, 둘 다 사용하려고한다.

여기 내 복수화 된 매퍼가있어.

public class CustomPluralizedMapper<T> : PluralizedAutoClassMapper<T>
where T : class 
{
    private readonly Type[] SinglularTablePocoTypes = new []{
        typeof(LibraryInfo)
    };

    public override void Table(string tableName)
    {
        base.Table(tableName);

        if(SinglularTablePocoTypes.Any(type => string.Equals(type.Name, tableName, StringComparison.CurrentCultureIgnoreCase)))
            TableName = tableName;
    }
}

... 그리고 여기 LibraryInfo 클래스를위한 mapper가 있습니다.

public class LibraryInfoMapper : ClassMapper<LibraryInfo>
{
    public LibraryInfoMapper()
    {
        Map(libraryInfo => libraryInfo.Name).Column("LibraryName");
        Map(libraryInfo => libraryInfo.Description).Column("LibraryDescription");
        AutoMap();
    }
}

PluralizedAutoClassMapper 다음을 호출하여 작동합니다 ...

DapperExtensions.DapperExtensions.DefaultMapper = typeof(CustomPluralizedMapper<>);

하지만 나는 다른 하나를 동시에 사용하는 방법을 모르겠습니다. 내가 뭘 놓치고 있니?

수락 된 답변

좋아, 알아 냈어. 문제는 IoC를 사용하고 POCO가 매핑과 다른 어셈블리에 있기 때문입니다.

간략히 말하자면, 내 모델에는 아무 생각이 없으며, 저장되는 위치 나 방법에 대한 관심이 없습니다. 해당 저장소와 상호 작용하는 방법을 설명하는 인터페이스 만 정의합니다. 내 DAL은 해당 인터페이스를 구현하는 클래스를 정의하고 SQLite를 백업 저장소로 사용합니다. 매핑은 SQLite와 관련해서 만 의미가 있으므로 매핑을 정의한 부분이 여기에 해당합니다.

문제는 DapperExtensions가 ClassMappers를 찾는 POCO를 정의하는 어셈블리에 반영되지만 내 어셈블리가 다른 어셈블리에 있었기 때문에 찾을 수 없었습니다.

그러나 다음 코드 행을 통해 외부 어셈블리를 검색하도록 DapperExtensions에 지시 할 수 있습니다 ...

DapperExtensions.DapperExtensions.SetMappingAssemblies(new[]{
    assemblyA, assemblyB, ...assemblyN
});

그래서 내 매핑이 정적 정적 Mapper 클래스 (정적 '초기화'호출이 있음)와 같은 위치에 정의되어 있기 때문에 지금해야 할 일은 DapperExtensions가 거기에서 검색하도록 지시하는 것입니다.

public static class Mappings
{
    public static void Initialize()
    {
        DapperExtensions.DapperExtensions.DefaultMapper = typeof(CustomPluralizedMapper<>);

        DapperExtensions.DapperExtensions.SetMappingAssemblies(new[]
        {
            typeof(Mappings).Assembly
        });
    }

    public class CustomPluralizedMapper<T> : PluralizedAutoClassMapper<T>
    where T : class 
    {
        ...
    }

    public class LibraryInfoMapper : ClassMapper<LibraryInfo>
    {
        ...
    }
}

그리고 지금 모든 것이 작동합니다!

LibraryInfoMapper에서 테이블 이름을 지정할 수 있기 때문에 실제로 CustomPluralizedMapper가 필요하지 않으므로 표준 PluralizedAutoClassMapper를 사용할 수 있습니다.

public static class Mappings
{
    public static void Initialize()
    {
        DapperExtensions.DapperExtensions.DefaultMapper = typeof(PluralizedAutoClassMapper<>);

        DapperExtensions.DapperExtensions.SetMappingAssemblies(new[]
        {
            typeof(Mappings).Assembly
        });
    }

    public class LibraryInfoMapper : ClassMapper<LibraryInfo>
    {
        public LibraryInfoMapper()
        {
            Table("LibraryInfo");
            AutoMap();
        }
    }
}

완료 및 완료! 이것을 알아내는 것에 대한 ZERO 문서가 있었기 때문에 다른 사람들에게 도움이되기를 바랍니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow