When I have a class with no default constructor, i.e. using dependency injection to pass its dependencies, can Newtonsoft.Json
create such an object?
For example:
public class SomeFoo
{
private readonly IFooDependency _dependency;
public SomeFoo(IFooDependency dependency){
if(dependency == null)
throw new ArgumentNullException("dependency");
_dependency = dependency;
}
public string Data { get; set; }
public int MoreData { get; set; }
public void DoFoo(){
Data = _dependency.GetFooData();
MoreData = _dependency.GetMoreFooDate();
}
}
During serialization, I only care of storing Data and MoreData (and the type of the object, but let's don't complicate things for the moment). Now, to deserialize, can I call something like
var obj = JsonConvert.DeserializeObject<SomeFoo>(jsonText);
How can I let JsonConvert know about my DI container?
(Note: A work-around would be to always have default constructors in my classes, and call Service Locator in there to get any dependencies I need. I'm just looking for some more clean solution without poluting my classes with such constructors).
You shouldn't let JsonConvert
know anything about your DI container. The problems you're experiencing are caused by a flaw in the design of your application. The flaw here is that you mix data and behavior.
If you separate the data from the behavior your problem (and many other problems) will simply go away. You can do this by creating two classes: one for the data, and one for the behavior:
public class SomeFoo
{
public string Data { get; set; }
public int MoreData { get; set; }
}
public class SomeFooHandler
{
private readonly IFooDependency _dependency;
public SomeFooHandler(IFooDependency dependency) {
_dependency = dependency;
}
public void Handle(SomeFoo foo) {
foo.Data = _dependency.GetFooData();
foo.MoreData = _dependency.GetMoreFooDate();
}
}
Since now data and behavior are separated, SomeFoo
can be serialized without any problem and SomeFooHandler
can simply be injected. SomeFoo
has becomes a Parameter Object.