带参数

时间:2016-09-03 10:03:41

标签: autofac

请有人可以告诉我如何使用在运行时传递的参数注册类

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

运行时结果错误:

  

输入字符串的格式不正确。   调用构造函数&#39; Void .ctor(Int32)&#39;时抛出异常。在类型&#39; TabContentSending&#39;。 ---&GT;输入字符串的格式不正确。 (详见内部异常。)

1 个答案:

答案 0 :(得分:3)

如果要在类型注册期间传递参数值(如在代码示例中),可以使用各种可能性:命名,类型化和已解析参数。如果你想继续使用已解决的一个,就像在你的例子中一样,ResolvedParameter对象的第二个参数应该是一个lamba表达式,它返回你在解析实例时要使用的值。因此,因为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”注入整数orderId参数。

但是,如果你想在运行时传递orderId的值,你应该像往常一样注册你的类型,没有.WithParameter部分,然后,而不是注入ITabContentSending tabContentSending,你应该注入Func<int, ITabContentSending> tabContentSendingFunc。这样做,而不是注入实例,您注入一个委托,它允许您创建ITabContentSending的实例并传递orderId参数的正确值:

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

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