基于因子参数的自动构件构建

本文关键字:构件 构建 于因 参数 | 更新日期: 2023-09-27 18:06:17

是否有可能以一种方式注册组件,以便它们可以基于构造函数参数进行解析?

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>();
    }
}

基于因子参数的自动构件构建

只注册MyRepo一次,使用.InstancePerLifetimeScope()

当在web应用程序中使用时,这将相当于.InstancePerHttpRequest()(我假设在这种情况下,而不是调用没有参数的Resolve(),您只是采取注入的依赖项。)

那么,在传递参数时不直接解析IMyRepo,而是解析Owned<IMyRepo>:

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

这将有一个额外的优势,确保您的库解析与自定义连接被正确地释放。

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