2015-11-17 10 views
5

私はDapperExtensionsで遊んで始めました。とても有望です。しかし、私はClassMapperサブクラスの登録を処理する方法について混乱しています。DapperExtension 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; 
    } 
} 

を私の複数形マッパーだ...と、ここで私は、次を呼び出すことにより、仕事を得るLibraryInfoクラス

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<>); 

しかし、私は同時に他のものを使用する方法がわかりません。私は何が欠けていますか?

答えて

8

私はそれを理解しました。問題はIoCを使用していて、私のPOCOがマッピングとは異なるアセンブリにあるためです。

要するに、私のモデルにはわからないし、どこに格納されているのか気にしていない。そのストレージとのやり取りの仕方を記述したインタフェースだけを定義します。私のDALはそのインターフェイスを実装するクラスを定義し、SQLiteをバッキングストレージとして使用します。マッピングはSQLiteに関してのみ意味があるので、ここでマッピングを定義しました。

DapperExtensionsは、ClassMappersを探すPOCOを定義するアセンブリに反映されますが、私のものは別のアセンブリに含まれているため、見つからないという問題があります。私のマッピングが静的を持っている私の静的マッパークラス(同じ場所で定義されているので

ただし、だから... ...次のコード行を介して外部アセンブリを検索する

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

をDapperExtensionsを伝えることができます'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> 
    { 
     ... 
    } 
} 

これですべてが機能します。いっそ

、私は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(); 
     } 
    } 
} 

が完了し、やりました!これを見つけ出すためのゼロドキュメントがありましたので、これが他の人に役立つことを願っています!

+0

Resharperは「仮想メンバーがコンストラクタを呼び出す」と文句を言います:D –

+0

LibraryInfoMapperの意味ですか?私はReSharperを使用しないので、あなたが何を参照しているのか分かりません。それでも、これはうまくいき、私はまだそれに一つの問題があります。 – MarqueIV

関連する問題