C# 如何包装函数Func<;等轴测,T>;代表
我想使用FuncC# 如何包装函数Func<;等轴测,T>;代表,c#,delegates,autofac,func,C#,Delegates,Autofac,Func,我想使用Func作为方法参数包装一个库,其中ISomething是库的一部分。 我的包装应该包含对库的所有引用,而使用包装的人不需要引用库 我想包装Autofac Register方法(使用lambda表达式),如下所示 我不知怎么的需要把这个 Func<IDependencyContainer, T> delegate1 Func delegate1 到 Func delegate1 这就是我当前的尝试: public IDependencyContainerToAddOpt
Func<IDependencyContainer, T> delegate1
Func delegate1
到
Func delegate1
这就是我当前的尝试:
public IDependencyContainerToAddOptions<T> WrapperRegister<T>
(
Func<IDependencyContainer, T> delegate1
)
{
return new DependencyContainerToAddOptions<T>(_containerBuilder.Register(delegate1));
}
public idependencyContainerLoadDoptions包装器寄存器
(
职能代表1
)
{
返回新的DependencyContainerLoadDoptions(_containerBuilder.Register(delegate1));
}
TLDR: 如何包装Autofac的Register方法,可以这样调用:
_builder.Register(ctx =>
{ var profileService = ctx.Resolve<IUserProfileService>();
\u builder.Register(ctx=>
{var profileService=ctx.Resolve();
定义如下:
/// <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));
}
//
///将委托注册为组件。
///
///实例的类型。
///集装箱制造商。
///代表必须注册。
///允许配置注册的注册生成器。
公共静态IRegistrationBuilder
登记册(
这个集装箱建造商,
职能代表(1)
{
如果(delegate1==null)抛出新的ArgumentNullException(nameof(delegate1));
返回builder.Register((c,p)=>delegate1(c));
}
包装器的用户不必向Autofac添加依赖项。看起来您试图做的事情与很多重叠,特别是,您正在询问如何有效地复制Autofac一些注册语法,我猜这样您的应用程序就可以在不引用Autofac的情况下注册 有一些很好的理由这样做,但我可能会试图说服您不要这样做。正如常见问题解答中所指出的: 您可能会花费大量时间来编写抽象和包装,只是为了复制大量特定于Autofac的语法和功能 这种类似的“从引用中隔离自己”的情况在日志记录中也经常发生,而且也没有很多非常好的解决方案 随着.NET Core的出现,一种方法是使用Microsoft.Extensions.DependencyInjection抽象。在
IServiceCollection
中注册内容,然后就可以使用了。这将限制抽象支持的内容,但它提供了不必维护的抽象
但是,再一次,假设你真的想保持你自己的。如果你想让人们登记“代码> FUNC< /代码>,那么你应该意识到,<代码> ICMOMPONTRONTURNE/CODE >是一个AutoFac的东西,这会打破你的孤立。你提到在底部的更新中,你希望你的用户没有对AutoFac的引用……但请考虑,A.您需要镜像所有Autofac行为和语法
因此,如果要这样做,您需要创建包装和抽象。许多包装和抽象。这些都是值得维护的。模式将是:
- 创建一个界面,该界面公开了要向客户端提供的功能
- 创建一个包装器/代理类,用于包装Autofac内容并实现接口
- 在合成根目录中(例如,应用程序启动等),包装Autofac实现并完成所有工作
公共接口IMyComponentContext
{
T解析();
}
公共类ComponentContextWrapper:IMyComponentContext
{
专用只读IComponentContext_autofacContext;
公共组件上下文包装器(IComponentContext autofacContext)
{
_autofacContext=autofacContext;
}
公共事务解决方案
{
返回此值。_autofacContext.Resolve();
}
}
会有很多的,然后
- 为
创建包装器IComponentContext
- 为所有注册位创建包装器
- 基本上已经实现了您所拥有的功能-除非您需要根据需要包装/展开。例如:
//在您实际注册代理的地方,您将
//要为您的客户提供包装,请执行以下操作:
builder.Register((c,p)=>delegate1(新组件contextwrapper(c));
如果我还没有说清楚的话,我有一个非常强烈的观点,那就是这是一个坏主意。这需要大量的工作,除非真的有一些潜在的需要离开Autofac,否则维护抽象、测试抽象等都没有真正的回报。然而,如果你想保持这种分离,那就是你需要做的。祝你好运!不确定我是否理解正确,您只想将
Register
方法包装到委托中吗?不,我想从Autofac中包装此函数:\u builder.Register(ctx=>{var profileService=ctx.Resolve();
我编辑了我的问题以使其更易于理解。这部分不清楚:“使用包装器的人不需要引用库。“如果我理解正确,您指的是包含ISomething
的库。但是您可以注册接口的实现,而无需引用接口。您能否澄清您试图完成的任务?有一些内容涉及包装注册函数以注册委托。这些有帮助吗?”-“使用包装器的人不需要引用库。”-你是指包含ISomething的库?-是的。我尝试了“在不引用接口的情况下注册接口的实现”,但它不起作用:`public void WrappedRegister(Func delegate1){builder.register(delegate1)}公共类组件上下文:IComponentContext{`
/// <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));
}