Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何包装函数Func<;等轴测,T>;代表_C#_Delegates_Autofac_Func - Fatal编程技术网

C# 如何包装函数Func<;等轴测,T>;代表

C# 如何包装函数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作为方法参数包装一个库,其中ISomething是库的一部分。 我的包装应该包含对库的所有引用,而使用包装的人不需要引用库

我想包装Autofac Register方法(使用lambda表达式),如下所示

我不知怎么的需要把这个

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