Time to try some different IoC frameworks. Let’s take a look at the basics of Autofac. Using the simple IService implementation and a client with a constructor that requires the IService injected into we get the following code.
public interface IService { void Run(); } public class LocalService : IService { public void Run() { Console.WriteLine("LocalService"); } } public interface IClient { IService Service { get; } void Run(); } public class Client : IClient { public Client(IService service) { Service = service; } public IService[] Service { get; private set; } public void Run() { Service.Run(); } }
We can set up bindings in code using the following
var builder = new ContainerBuilder(); builder.RegisterType().As(); builder.RegisterType().As(); var container = builder.Build(); var client = container.Resolve(); client.Run();
If we have multiple IService implementations then changing the Client to
public interface IClient { IService[] Service { get; } void Run(); } public class Client : IClient { public Client(IService[] service) { Service = service; } public IService[] Service { get; private set; } public void Run() { foreach(IService service in Service) service.Run(); } } var builder = new ContainerBuilder(); builder.RegisterType().As(); builder.RegisterType().As(); builder.RegisterType().As(); var container = builder.Build(); var client = container.Resolve(); client.Run();
Now let’s remove the constructor and use property injection. The client changes to
public class Client : IClient { public IService[] Service { get; set; } // the run method as before }
There’s no attributes or the likes to suggest that a property should be injected into. The change is in the binding code, just changing the Client registration code to
builder.RegisterType<Client>().As<IClient>().PropertiesAutowired();