Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何注册DapperExtension类映射器子类以便使用它们?_C#_Dapper_Dapper Extensions - Fatal编程技术网

C# 如何注册DapperExtension类映射器子类以便使用它们?

C# 如何注册DapperExtension类映射器子类以便使用它们?,c#,dapper,dapper-extensions,C#,Dapper,Dapper Extensions,我刚刚开始玩DapperExtensions,它看起来很有前途。然而,我对如何注册ClassMapper子类感到困惑 我有一个自定义的PluralizedAutoClassMapper和一个常规的ClassMapper,我正在尝试使用这两个工具 这是我的多重映射器 public class CustomPluralizedMapper<T> : PluralizedAutoClassMapper<T> where T : class { private read

我刚刚开始玩DapperExtensions,它看起来很有前途。然而,我对如何注册ClassMapper子类感到困惑

我有一个自定义的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;
    }
}
公共类CustomPluralizedMapper:PluralizedAutoClassMapper
T:在哪里上课
{
私有只读类型[]SinglularTablePocoTypes=new[]{
类型(图书馆信息)
};
公共重写无效表(字符串tableName)
{
base.Table(tableName);
if(SinglularTablePocoTypes.Any(type=>string.Equals(type.Name、tableName、StringComparison.CurrentCultureIgnoreCase)))
TableName=TableName;
}
}
…这是专门用于LibraryInfo类的映射器

public class LibraryInfoMapper : ClassMapper<LibraryInfo>
{
    public LibraryInfoMapper()
    {
        Map(libraryInfo => libraryInfo.Name).Column("LibraryName");
        Map(libraryInfo => libraryInfo.Description).Column("LibraryDescription");
        AutoMap();
    }
}
公共类库信息映射器:类映射器
{
公共图书馆信息映射器()
{
Map(libraryInfo=>libraryInfo.Name).Column(“LibraryName”);
映射(libraryInfo=>libraryInfo.Description).Column(“LibraryDescription”);
自动映射();
}
}
我通过调用以下命令来开始工作的PluralizedAutoClassMapper

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

但我不知道如何同时使用另一个。我错过了什么?

好的,我知道了。问题是因为我正在使用IoC,我的POCO与映射位于不同的程序集中

简而言之,我的模型不知道,也不关心它存储在哪里或如何存储。它只定义一个接口,描述它需要如何与该存储交互。我的DAL定义了一个实现该接口的类,并使用SQLite作为其备份存储。由于映射只对SQLite有意义,所以我在这里定义了映射

问题是DapperExtensions会反射到定义POCO的程序集中,以查找它们的类映射器,但由于我的类映射器位于不同的程序集中,因此找不到它们

但是,您可以告诉DapperExtensions通过以下代码行搜索外部程序集

DapperExtensions.DapperExtensions.SetMappingAssemblies(new[]{
    assemblyA, assemblyB, ...assemblyN
});
因此,由于我的映射是在与静态映射器类(具有静态“Initialize”调用)相同的位置定义的,所以我现在要做的就是告诉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>
    {
        ...
    }
}
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();
        }
    }
}
公共静态类映射
{
公共静态void Initialize()
{
DapperExtensions.DapperExtensions.DefaultMapper=typeof(CustomPluralizedMapper);
DapperExtensions.DapperExtensions.SetMappingAssemblys(新[]
{
类型(映射)。程序集
});
}
公共类CustomPluralizedMapper:PluralizedAutoClassMapper
T:在哪里上课
{
...
}
公共类库信息映射器:类映射器
{
...
}
}
现在一切都好了

更好的是,由于我可以在LibraryInfoMapper中指定表名,实际上不需要我的CustomPluralizedMapper,因此我可以像这样使用标准PluralizedAutoClassMapper

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>
    {
        ...
    }
}
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();
        }
    }
}
公共静态类映射
{
公共静态void Initialize()
{
DapperExtensions.DapperExtensions.DefaultMapper=typeof(PluralizedAutoClassMapper);
DapperExtensions.DapperExtensions.SetMappingAssemblys(新[]
{
类型(映射)。程序集
});
}
公共类库信息映射器:类映射器
{
公共图书馆信息映射器()
{
表(“图书馆信息”);
自动映射();
}
}
}

做了,做了!没有找到这个的文档,所以我希望这对其他人有帮助

Resharper抱怨“虚拟成员在构造函数中调用”:你是说在LibraryInfoMapper中?我不使用ReSharper,所以我看不出你指的是什么。但是,这仍然有效,我还没有遇到任何问题。你什么时候调用initialize方法?简而言之,在使用映射程序之前的任何时候。您可以将此初始化设置在应用程序启动的开始处。