【发布时间】:2019-09-10 06:37:15
【问题描述】:
我想使用 Func 作为方法参数来包装库,其中 ISomething 是库的一部分。 我的包装器应该包含对库的所有引用,使用包装器的人不需要引用库。
我想包装 Autofac Register 方法(使用 lambda 表达式),比如这里https://autofaccn.readthedocs.io/en/latest/register/registration.html#lambda-expression-components
我需要以某种方式转换
Func<IDependencyContainer, T> delegate1
到一个
Func<IComponentContext, T> delegate1
这是我目前的尝试:
public IDependencyContainerToAddOptions<T> WrapperRegister<T>
(
Func<IDependencyContainer, T> delegate1
)
{
return new DependencyContainerToAddOptions<T>(_containerBuilder.Register(delegate1));
}
TLDR:
如何包装Autofac的Register方法,可以这样调用:
_builder.Register(ctx =>
{ var profileService = ctx.Resolve<IUserProfileService>();
它是这样定义的:
/// <summary>
/// Register a delegate as a component.
/// </summary>
/// <typeparam name="T">The type of the instance.</typeparam>
/// <param name="builder">Container builder.</param>
/// <param name="delegate">The delegate to register.</param>
/// <returns>Registration builder allowing the registration to be configured.</returns>
public static IRegistrationBuilder<T, SimpleActivatorData, SingleRegistrationStyle>
Register<T>(
this ContainerBuilder builder,
Func<IComponentContext, T> delegate1)
{
if (delegate1 == null) throw new ArgumentNullException(nameof(delegate1));
return builder.Register((c, p) => delegate1(c));
}
包装器的用户不必将依赖项添加到 Autofac。
【问题讨论】:
-
不确定我是否理解正确,您只是想将
Register方法包装到委托中? -
不,我想从 Autofac 包装这个函数:
_builder.Register(ctx => { var profileService = ctx.Resolve<IUserProfileService>(); -
我编辑了我的问题以使其更易于理解。
-
这部分不清楚:“使用包装器的人应该不需要引用库。”如果我理解正确,您的意思是包含
ISomething的库。但是您可以在不引用接口的情况下注册接口的实现。您能澄清一下您要完成的工作吗?有些东西涉及包装注册函数以注册代表here。这些有帮助吗? -
-“使用包装器的人不需要引用库。” - 你的意思是包含 ISomething 的库? -是的。我尝试了“在不引用接口的情况下注册接口的实现”,但它不起作用:` public void WrappedRegister
(Func delegate1) { builder.Register(delegate1); } 公共类 TheComponentContext: IComponentContext {...`