@@ -24,7 +24,7 @@ namespace SharpRepository.MongoDbRepository
2424 private readonly string _databaseName ;
2525 protected IMongoDatabase Database ;
2626
27- private readonly Dictionary < Type , BsonType > _keyTypeToBsonType =
27+ private readonly Dictionary < Type , BsonType > _keyTypeToBsonType =
2828 new Dictionary < Type , BsonType >
2929 {
3030 { typeof ( string ) , BsonType . String } ,
@@ -33,7 +33,7 @@ namespace SharpRepository.MongoDbRepository
3333 { typeof ( byte [ ] ) , BsonType . ObjectId }
3434 } ;
3535
36- private readonly Dictionary < Type , IIdGenerator > _keyTypeToBsonGenerator =
36+ private readonly Dictionary < Type , IIdGenerator > _keyTypeToBsonGenerator =
3737 new Dictionary < Type , IIdGenerator >
3838 {
3939 { typeof ( string ) , new StringObjectIdGenerator ( ) } ,
@@ -42,17 +42,29 @@ namespace SharpRepository.MongoDbRepository
4242 { typeof ( byte [ ] ) , new BsonBinaryDataGuidGenerator ( GuidRepresentation . Standard ) }
4343 } ;
4444
45+ #region Constructors
46+
4547 internal MongoDbRepositoryBase ( ICachingStrategy < T , TKey > cachingStrategy = null )
4648 : base ( cachingStrategy )
4749 {
4850 Initialize ( ) ;
4951 }
5052
51- internal MongoDbRepositoryBase ( string connectionString , ICachingStrategy < T , TKey > cachingStrategy = null )
53+ internal MongoDbRepositoryBase ( string connectionString , ICachingStrategy < T , TKey > cachingStrategy , SslSettings sslSettings )
5254 : base ( cachingStrategy )
5355 {
5456 _databaseName = MongoUrl . Create ( connectionString ) . DatabaseName ;
55- var cli = new MongoClient ( connectionString ) ;
57+
58+ MongoClient cli ;
59+ if ( sslSettings != null )
60+ {
61+ var settings = MongoClientSettings . FromUrl ( new MongoUrl ( connectionString ) ) ;
62+ settings . SslSettings = sslSettings ;
63+ cli = new MongoClient ( settings ) ;
64+ }
65+ else
66+ cli = new MongoClient ( connectionString ) ;
67+
5668 Initialize ( cli . GetDatabase ( _databaseName ) ) ;
5769 }
5870
@@ -62,16 +74,13 @@ internal MongoDbRepositoryBase(IMongoDatabase mongoDatabase, ICachingStrategy<T,
6274 Initialize ( mongoDatabase ) ;
6375 }
6476
65- private string DatabaseName
66- {
67- get { return string . IsNullOrEmpty ( _databaseName ) ? TypeName : _databaseName ; }
68- }
77+ #endregion
6978
7079 private void Initialize ( IMongoDatabase mongoDatabase = null )
7180 {
7281 Database = mongoDatabase ?? new MongoClient ( "mongodb://localhost/default" ) . GetDatabase ( MongoUrl . Create ( "mongodb://localhost/default" ) . DatabaseName ) ;
7382
74- if ( ! BsonClassMap . IsClassMapRegistered ( typeof ( T ) ) )
83+ if ( ! BsonClassMap . IsClassMapRegistered ( typeof ( T ) ) )
7584 {
7685 var primaryKeyPropInfo = GetPrimaryKeyPropertyInfo ( ) ;
7786 var primaryKeyName = primaryKeyPropInfo . Name ;
@@ -87,7 +96,7 @@ private void Initialize(IMongoDatabase mongoDatabase = null)
8796 {
8897 cm . IdMemberMap . SetSerializer ( new StringSerializer ( _keyTypeToBsonType [ typeof ( TKey ) ] ) ) ;
8998 cm . IdMemberMap . SetIdGenerator ( _keyTypeToBsonGenerator [ typeof ( TKey ) ] ) ;
90- }
99+ }
91100 }
92101
93102 cm . Freeze ( ) ;
@@ -110,13 +119,16 @@ protected override T GetQuery(TKey key, IFetchStrategy<T> fetchStrategy)
110119 {
111120 var keyBsonType = ( ( StringSerializer ) BsonClassMap . LookupClassMap ( typeof ( T ) ) . IdMemberMap . GetSerializer ( ) ) . Representation ;
112121 var keyMemberName = BsonClassMap . LookupClassMap ( typeof ( T ) ) . IdMemberMap . MemberName ;
113- if ( IsValidKey ( key ) ) {
122+ if ( IsValidKey ( key ) )
123+ {
114124 var keyBsonValue = BsonTypeMapper . MapToBsonValue ( key , keyBsonType ) ;
115125 var filter = Builders < T > . Filter . Eq ( keyMemberName , keyBsonValue ) ;
116126 return BaseCollection ( ) . Find ( filter ) . FirstOrDefault ( ) ;
117- } else return default ( T ) ;
127+ }
128+ else return default ( T ) ;
118129 }
119130
131+ #region Math
120132 public override int Sum ( ISpecification < T > criteria , Expression < Func < T , int > > selector )
121133 {
122134 return QueryManager . ExecuteSum (
@@ -297,89 +309,36 @@ public override double Average(ISpecification<T> criteria, Expression<Func<T, lo
297309 ) ;
298310 }
299311
312+ #endregion
313+
300314 protected override void AddItem ( T entity )
301315 {
302316 BaseCollection ( ) . InsertOne ( entity ) ;
303317 }
304318
305319 protected override void DeleteItem ( T entity )
306320 {
307- TKey pkValue ;
308- GetPrimaryKey ( entity , out pkValue ) ;
321+ GetPrimaryKey ( entity , out var pkValue ) ;
309322
310323 if ( IsValidKey ( pkValue ) )
311324 {
312- var keyPropertyName = BsonClassMap . LookupClassMap ( typeof ( T ) ) . IdMemberMap . MemberName ;
313- var keyPair = GetMongoProperty ( entity , keyPropertyName ) ;
314- var filter = Builders < T > . Filter . Eq ( keyPair . Key , keyPair . Value ) ;
315-
325+ var pkName = GetPrimaryKeyPropertyInfo ( ) . Name ;
326+ var filter = Builders < T > . Filter . Eq ( pkName , pkValue ) ;
316327 BaseCollection ( ) . DeleteOne ( filter ) ;
317328 }
318329 }
319330
320331 protected override void UpdateItem ( T entity )
321332 {
322- TKey pkValue ;
323- GetPrimaryKey ( entity , out pkValue ) ;
333+ GetPrimaryKey ( entity , out var pkValue ) ;
324334 if ( IsValidKey ( pkValue ) )
325335 {
326- var keyMap = BsonClassMap . LookupClassMap ( typeof ( T ) ) . IdMemberMap ;
327- var keyPropertyName = keyMap . MemberName ;
328- var keyBsonType = ( ( StringSerializer ) keyMap . GetSerializer ( ) ) . Representation ;
329- var keyBsonPropertyValue = BsonTypeMapper . MapToBsonValue ( pkValue , keyBsonType ) ;
330- var keyPair = new KeyValuePair < string , BsonValue > ( keyPropertyName , keyBsonPropertyValue ) ;
331- var filter = Builders < T > . Filter . Eq ( keyPair . Key , keyPair . Value ) ;
332-
333-
334- var bsonMembers = BsonClassMap . LookupClassMap ( typeof ( T ) ) . AllMemberMaps . Where ( m => m . MemberName != keyPropertyName ) ;
335- var updates = new List < UpdateDefinition < T > > ( ) ;
336- foreach ( var members in bsonMembers )
337- {
338- var propPair = GetMongoProperty ( entity , members . MemberName ) ;
339- updates . Add ( Builders < T > . Update . Set ( propPair . Key , propPair . Value ) ) ;
340- }
341-
342- BaseCollection ( ) . UpdateOne ( filter , Builders < T > . Update . Combine ( updates ) ) ;
343- }
344-
345- }
346-
347- public static KeyValuePair < string , BsonValue > GetMongoProperty ( T entity , string propertyName )
348- {
349- var value = typeof ( T ) . GetProperty ( propertyName ) . GetValue ( entity ) ;
350- var memberMap = BsonClassMap . LookupClassMap ( typeof ( T ) ) . GetMemberMap ( propertyName ) ;
351- var memberBsonType = GetBsonType ( value , memberMap ) ;
352-
353- // some "non-string types are mapped to string"
354- if ( memberBsonType == BsonType . String )
355- {
356- value = value . ToString ( ) ;
336+ var pkName = GetPrimaryKeyPropertyInfo ( ) . Name ;
337+ var filter = Builders < T > . Filter . Eq ( pkName , pkValue ) ;
338+ BaseCollection ( ) . ReplaceOne ( filter , entity ) ;
357339 }
358-
359- var bsonPropertyValue = BsonTypeMapper . MapToBsonValue ( value , memberBsonType ) ;
360- return new KeyValuePair < string , BsonValue > ( propertyName , bsonPropertyValue ) ;
361340 }
362-
363- protected static BsonType GetBsonType ( object value , BsonMemberMap memberMap )
364- {
365- BsonType keyBsonType ;
366-
367- if ( value == null ) {
368- keyBsonType = BsonType . Null ;
369- } else {
370- var propertyInfo = memberMap . GetSerializer ( ) . GetType ( ) . GetProperty ( "Representation" ) ;
371- if ( propertyInfo != null )
372- {
373- keyBsonType = ( BsonType ) propertyInfo . GetValue ( memberMap . GetSerializer ( ) ) ;
374- } else
375- {
376- keyBsonType = BsonType . Array ;
377- }
378- }
379-
380- return keyBsonType ;
381- }
382-
341+
383342 protected override void SaveChanges ( )
384343 {
385344 }
0 commit comments