是否有像Ninject一样的Autofac提供商?

mar*_*dok 4 .net dependency-injection ninject autofac

我有一个问题,是否有像Ninject的提供商那样的Autofac供应商?我的意思是,我可以在Autofac中使用它吗?

Bind <ISessionFactory> ().ToProvider(new IntegrationTestSessionFactoryProvider());
Run Code Online (Sandbox Code Playgroud)

Jim*_*lla 5

我正在研究Ninject的提供者和激活上下文,看起来Providers是一个处理Autofac只能处理lambda的场景的接口.在Ninject的例子中,他们有:

Bind<IWeapon>().ToProvider(new SwordProvider());

abstract class SimpleProvider<T> {
// Simple implementations of the junk that you don't care about...

    public object Create(IContext context) {
        return CreateInstance(context);
    }

    protected abstract T CreateInstance(IContext context);
}

class SwordProvider : SimpleProvider<Sword> {
    protected override Sword CreateInstance(IContext context) {
        Sword sword = new Sword();
        // Do some complex initialization here.
        return sword;
    }
}
Run Code Online (Sandbox Code Playgroud)

与Autofac的委托语法相比,所有这些似乎都是疯狂的过度杀伤:

builder.Register(context =>
                      {
                           Sword sword = new Sword();
                           // Do some complex initialization here.
                           return sword;
                      }).As<IWeapon>();
Run Code Online (Sandbox Code Playgroud)

编辑:如果您的init足够复杂以保证自己的类,您仍然可以这样做:

builder.RegisterType<SwordFactory>();
builder.Register(c => c.Resolve<SwordFactory>().Create()).As<IWeapon>();

// this class can be part of your model
public class SwordFactory
{
    public Sword Create()
    {
        Sword sword = new Sword();
        // Do some complex initialization here.
        return sword;
    }
}
Run Code Online (Sandbox Code Playgroud)

关于这一点的好处是你仍然与你的DI框架分离.