This is what I want from DI container:
public class Class
{
public Class(IDependency dependency, string data) { }
}
var obj = di.Resolve<Class>(() => new Class(null, "test"));
Points of interest:
Another major requirements is that I'd like my components to be automatically picked up, i.e. I don't want to register Class - I want IoC to pick it up because it knows how to resolve IDependency.
Also, Property Injection can be useful sometimes, but this is optional.
The question is really about the combination of features - to have all of them - type-safe, parameters, automatic pick-up... It's easy to check one feature, but a combination of them is not easy to verify unless one's familiar with particular container and knows its features. Thus the question.
A DI Container is a framework to create dependencies and inject them automatically when required. It automatically creates objects based on the request and injects them when required. DI Container helps us to manage dependencies within the application in a simple and easy way.
At its core a DI Container creates objects based on mappings between interfaces and concrete types. This will allow you to request an abstract type from the container: IFoo f = container.
The most valuable benefit of using an IoC container is that you can have a configuration switch in one place which lets you change between, say, test mode and production mode.
IoC Container (a.k.a. DI Container) is a framework for implementing automatic dependency injection. It manages object creation and it's life-time, and also injects dependencies to the class.
I think you would be better off by defining an Abstract Factory that can create your class.
public interface IFactory
{
MyClass Create(string data);
}
You could then create an implementation of IFactory like this:
public class MyFactory : IFactory
{
private IDependency dependency;
public MyFactory(IDependency dependency)
{
if (dependency == null)
{
throw new ArgumentNullException("dependency");
}
this.dependency = dependency;
}
#region IFactory Members
public MyClass Create(string data)
{
return new MyClass(this.dependency, data);
}
#endregion
}
In your container, you would register both MyFactory and the implementation of IDependency.
You can now use the container to resolve the Factory, and the Factory to get the class:
var mc = container.Resolve<IFactory>().Create(data);
This approach is completely type-safe and nicely decouples the dependencies from run-time application data.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With