I have a large class with complex properties. I'd like to introduce a default implementation, allow the user to override part of the default implementation and also make sure the user calls a sync method so that the object is always at a consistent state.
public class Complex {
public int Id { get; set; }
public CustomComplex1 Custom1 { get; set; }
public CustomComplex2 Custom2 { get; set; }
public Complex()
{
Custom1 = new CustomComplex1() { Name = "Bla", Cost = 55, etc..} // provide default values
}
//this method must always be called!
public void RegisterObject()
{
}
}
Class could be used like this:
var a = new Complex(); // all default values set
a.Custom1.Name = "newName"; // I'd like to use the default values, but just change something..
a.RegisterObject(); // problem - client might forget to call this!
I thought about using the builder pattern, but then I'll have to provide methods to modify each variation of CustomComplex1 type - too much work & maintenance. From the other hand if I expose Custom1 as a public property it looks like I'm doing the exact opposite of the builder pattern's intent. So what is a good way to A.allow the user modify any property of my complex object and B.force him to call the RegisterObject on compile time?