基于ctor参数的Autofac组件构建

时间:2011-08-19 00:58:40

标签: c# autofac

是否可以以某种方式注册组件,以便可以根据构造函数参数解析它们?

public interface IRepository<T>{}
public interface IMyRepo {}

public class MyRepo : IRepository<TEntity>, IMyRepo
{
    public MyRepo(IDbConnection connection){}
    public MyRepo(){}
}

// lots of other repositories...

public class Global
{
    public void BuildDIContainer()
    {
        var builder = new ContainerBuilder();
        var assembly = Assembly.GetExecutingAssembly();

        //any class that implements IRepository<T> is instance per request
        builder.RegisterAssemblyTypes(typeof (IRepository<>).Assembly, assembly)
            .AsClosedTypesOf(typeof (IRepository<>))
            .AsImplementedInterfaces().InstancePerHttpRequest();

        //any class that implements IRepository<T> with IDbConnection as ctor parameter is instance per dependency
        builder.RegisterAssemblyTypes(typeof(IRepository<>).Assembly, assembly)
            .UsingConstructor(typeof(IDbConnection)) // <-- ??
          .AsClosedTypesOf(typeof(IRepository<>))
          .AsImplementedInterfaces().InstancePerDependency();

        //............

        //per dependency
        var repo1 = ComponentContext.Resolve<IMyRepo>(new NamedParameter("connection", new SqlConnection("...")));
        //per request
        var repo2 = ComponentContext.Resolve<IMyRepo>();
    }
}

1 个答案:

答案 0 :(得分:5)

仅使用MyRepo注册.InstancePerLifetimeScope()一次。

当在Web应用程序中使用时,这等同于.InstancePerHttpRequest()(我假设在这种情况下,不是在没有参数的情况下调用Resolve(),而是仅仅采用注入的依赖关系。 )

然后,不要在传递参数时直接解析IMyRepo,而是解析Owned<IMyRepo>

using (var repoWithParam = ComponentContext.Resolve<Owned<IMyRepo>>(
    new NamedParameter("connection", ...))){
    // Use repoWithParam.Value here
}

这将具有额外的优势,可确保正确释放自定义连接解析的存储库。

希望这会有所帮助,对你的场景做一些假设,所以如果有任何不清楚的地方,请告诉我。