【问题标题】:Using DryIoc with a dependency and primitive values将 DryIoc 与依赖项和原始值一起使用
【发布时间】:2017-05-02 19:12:53
【问题描述】:

我正在注册要为接口创建的实现。此实现构造函数具有三个参数:

public ProfileImageService(ISqlConnection connection, string localStorageLocation, string serverPath)

我已经像这样注册了 ISqlConnection:

c.Register<Data.ISqlConnection, Data.TsqlConnection>(setup: Setup.With(openResolutionScope: true));

但是,当我像这样注册 ProfileImageService 时:

c.Register<Data.Services.Profile.IImageService, Data.Services.Profile.ProfileImageService>(Made.Of(() => new Data.Services.Profile.ProfileImageService(Arg.Index<Data.ISqlConnection>(0), Arg.Index<string>(1), Arg.Index<string>(2)), requestIgnored =>c.Resolve<Data.ISqlConnection>(), requestIgnored => localImageStoragePath, requestIgnored => localImageUrl));

我收到以下错误:

Message=State 是使用(可能是注入)项目所必需的 Abc.Data.TsqlConnection。要启用项目使用,您可以指定 容器.With(规则 => rules.WithItemToExpressionConverter(YOUR_ITEM_TO_EXPRESSION_DELEGATE))。

我已阅读此 SpecifyDependencyAndPrimitiveValues 并尝试像他们一样对其进行修改,但他们的示例仅显示了原语或依赖项,而不是两者,而且我找不到它们在没有编译错误的情况下混合的语法。谁能给我一些关于如何注册这个实例的指导,指定两个字符串的值和依赖项的值?

【问题讨论】:

  • 你使用什么版本的 DryIoc?

标签: c# asp.net-web-api dependency-injection dryioc


【解决方案1】:

你是这样做的(使用最新的 DryIoc v2.10.6):你不需要在参数中指定c.Resolve&lt;ISqlConnection&gt;(),只需使用Arg.Of&lt;ISqlConnection&gt;()

using System;
using DryIoc;

public class Program
{
    public static void Main()
    {
        var c = new Container();

        var localImageStoragePath = "a";
        var localImageUrl = "b";

        c.Register<ISqlConnection, TsqlConnection>();
        c.Register<IImageService, ProfileImageService>(
            Made.Of(() => new ProfileImageService(
                Arg.Of<ISqlConnection>(), 
                Arg.Index<string>(0), 
                Arg.Index<string>(1)), 
                _ => localImageStoragePath, 
                _ => localImageUrl));

        var imgService = c.Resolve<IImageService>();

        Console.WriteLine(imgService);
    }

    public interface IImageService {}

    public class ProfileImageService: IImageService
    {
        public ProfileImageService(ISqlConnection conn, string a, string b) {}

    }

    public interface ISqlConnection {}

    public class TsqlConnection : ISqlConnection {} 
}

如果您的字符串参数不应该更改,甚至更好:

    c.Register<IImageService, ProfileImageService>(
        Made.Of(() => new ProfileImageService(
            Arg.Of<ISqlConnection>(), 
            localImageStoragePath, 
            localImageUrl)));

这里是live proof

【讨论】:

  • 有趣的是,我的服务注册在您的代码示例中有效。我不确定这是版本问题还是我在 WebAPI 项目中工作。今晚我会看看它并尝试你的代码谢​​谢。
  • 您的代码完全解决了问题,谢谢。我是否正确地说我的问题是对于已经定义的依赖关系解决方案,您不必指定 Arg.Index 并且我定义它会引入问题?
  • 我还不确定,因为新版本的行为略有改变。但最初(在早期版本中)这将是问题。
猜你喜欢
  • 2015-06-08
  • 2022-11-04
  • 2017-11-06
  • 1970-01-01
  • 2018-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多