I've been slowly teaching myself the fundamentals of interface driven programming and I'm struggling to get my head round a few principles regarding inversion of control specifically with Ninject.
Lets say I have a concrete model class as follows...
public sealed class Host : EntityAuditable<Host, Guid>
I have a base class which defines methods for the model like this....
public abstract class EntityAuditable<T, TKey> :
IEntity,
IDisposable,
IComparable<EntityAuditable<T, TKey>>
where T : EntityAuditable<T, TKey>, new()
IEntity is a very simple interface that defines an object property 'Id'.
Now the constructor for my Host class would be as follows....
public Host(IService<Host> service)
{
this.service = service;
this.id = Guid.NewGuid();
}
Where the IService implementation provides methods to persist objects to the repository specific to the service.
What I would like to do is provide some static methods in my base class so that I can write code like
Host.LoadAll();
and know that my bindings will be injected correctly. My implementation in the base class would be something similar to this...
public static IList<T> LoadAll()
{
T instance = new T();
List<T> instances = new List<T>(instance.DataSelectAll());
// Clean up the instance.
instance.Dispose();
return instances;
}
Is this possible or am I doing something fundamentally wrong?
Does Ninject work in a way that it knows it should be calling my parameterized constructor when I call new T() ?
The examples I have found in the documentation (Which is sadly out of date) use the kernel to create the object but I don't want to have kernel creating code littered about in my models.
I'd be doing all my binding in my Global.ascx file.