是否可以以某种方式注册组件,以便可以根据构造函数参数解析它们?
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>();
}
}
答案 0 :(得分:5)
仅使用MyRepo
注册.InstancePerLifetimeScope()
一次。
当在Web应用程序中使用时,这等同于.InstancePerHttpRequest()
(我假设在这种情况下,不是在没有参数的情况下调用Resolve()
,而是仅仅采用注入的依赖关系。 )
然后,不要在传递参数时直接解析IMyRepo
,而是解析Owned<IMyRepo>
:
using (var repoWithParam = ComponentContext.Resolve<Owned<IMyRepo>>(
new NamedParameter("connection", ...))){
// Use repoWithParam.Value here
}
这将具有额外的优势,可确保正确释放自定义连接解析的存储库。
希望这会有所帮助,对你的场景做一些假设,所以如果有任何不清楚的地方,请告诉我。