gpt4 book ai didi

带参数的 Autofac RegisterType

转载 作者:行者123 更新时间:2023-12-02 14:58:04 26 4
gpt4 key购买 nike

请有人建议我如何使用运行时传递的参数注册一个类

public interface ITabContentSending
{
TabType TheTabType { get; set; }
int? OrderId { get; set; }
}
public class TabContentSending : ITabContentSending
{
public TabType TheTabType { get; set; }
public int? OrderId { get; set; }

public TabContentSending(int orderId)
{
TheTabType = TabType.Table;
OrderId = orderId;
}

}

我目前的努力(显然是错误的)

            builder.RegisterType<TabContentSending>()
.As<ITabContentSending>()
.WithParameter(new ResolvedParameter(
(p, c) => p.ParameterType == typeof(int) && p.Name == "orderId",
(p, c) => "OrderId"));

导致运行时错误:

Input string was not in a correct format. An exception was thrown while invoking the constructor 'Void .ctor(Int32)' on type 'TabContentSending'. ---> Input string was not in a correct format. (See inner exception for details.)

最佳答案

如果您想在类型注册期间传递参数值(如代码示例中所示),您可以使用各种可能性:命名参数、类型参数和解析参数。如果您想保留已解决的参数,如您的示例所示,则 ResolvedParameter 的第二个参数object 应该是一个lambda 表达式,返回解析实例时要使用的值。所以,因为orderId是整数类型,它应该如下所示:

builder.RegisterType<TabContentSending>()
.As<ITabContentSending>()
.WithParameter(new ResolvedParameter(
(p, c) => p.ParameterType == typeof(int) && p.Name == "orderId",
(p, c) => 1)); // the value of "1" would be injected

在您的示例中,您尝试将字符串值“OrderId”注入(inject)整数 orderId参数。

但是,如果你想传递 orderId 的值在运行时,您应该照常注册您的类型,而不需要 .WithParameter部分,然后,而不是注入(inject) ITabContentSending tabContentSending ,你应该注入(inject)Func<int, ITabContentSending> tabContentSendingFunc 。这样做时,您不是注入(inject)实例,而是注入(inject)委托(delegate),它允许您创建 ITabContentSending 的实例。并传递适当的值 orderId参数:

var orderId = 1;
var instance = tabContentSendingFunc(orderId);

您可以找到有关注册期间传递参数的更多信息here ,以及关于参数化实例化 here .

关于带参数的 Autofac RegisterType,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39305680/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com