Is Autofac magical?
The answer is yes!
OK let me explain. I never registered anything as Func<IObservable<object>> and yet the below code still works. It turns out to be that not only does autofac understand Func<Dependency>(), it understands a whole bunch of things that you may or may not have intended to be dependency relationships. :)
The details [Copied straight from https://autofac.readthedocs.org/en/latest/resolve/relationships.html\]
B |
Direct Dependency | |
A needs B at some point in the future | Lazy<B> |
Delayed Instantiation |
A needs B until some point in the future | Owned<B> |
Controlled Lifetime |
A needs to create instances of B | Func<B> |
Dynamic Instantiation |
A provides parameters of types X and Y to B | Func<X,Y,B> |
Parameterized Instantiation |
A needs all the kinds of B | IEnumerable<B> , IList<B> , ICollection<B> |
Enumeration |
A needs to know X about B | Meta<B> and Meta<B,X> |
Metadata Interrogation |
A needs to choose B based on X | IIndex<X,B> |
So now I know!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autofac;
namespace IsAutoFacMagical
{
class CO : IObservable<object>
{
public IDisposable Subscribe(IObserver<object> observer)
{
throw new NotImplementedException();
}
}
class DO
{
public Func<IObservable<object>> Magic { get; set; }
}
class Program
{
static void Main(string[] args)
{
var cb = new ContainerBuilder();
cb.RegisterType<CO>().As<IObservable<object>>();
cb.RegisterType<DO>().PropertiesAutowired();
var x = cb.Build();
var d = x.Resolve<DO>();
var m1 = d.Magic();
}
}
}