Background, I am extending the ASP.NET Membership with custom classes and extra tables.
The ASP.NET MembershipUser has a protected constructor and a public method to read the data from the database. I have extended the database structure with custom tables and associated classes.
Instead of using a static method to create a new member, as in the original API: I allow the code to instantiate a simple object and fill the data because there are several entities.
Original Pattern #1 Protected constructor
> static CreateUser(string mydata, string, mydata, ...)
> User.Data = mydata;
> User.Update()
My Preferred Pattern #2 Public constructor
> newUser = new MembershipUser();
> newUser.data = ...
> newUser.ComplextObject.Data = ...
> newUser.Insert()
> newUser.Load(string key)
I find pattern #2 to be easier and more natural to use. But method #1 is more atomic and ensured to contain proper data.
I'd like to hear any opinions on pros/cons. The problem in my mind is that I prefer a simple CRUD/object but I am, also, trying to utilize the underlying API. These methods do not match completely. For example, the API has methods, like UnlockUser() and a readonly property for the IsLockedOut.
I can see there are a few possibilities.
Option #1 Have the object save/load itself but require a private constructor.
Option #2 Have the object save/load itself but let it have a public constructor
Option #3 One is to create a POCO/simple CRUD object and then have static methods for updating the database. ..............
Option #1 Benefits: Multi-threading safety "atomic", object integrity Detriments: Difficult to use -> passing lots of data, possibly require updating after creating which would require wrapping in a transaction in some cases so it seems messy
Option #2 Benefits: Easy to use, easy way to organize the transactions Downside: Object may or may not be set appropriately