将 DryIoc 与依赖项和原始值一起使用
Using DryIoc with a dependency and primitive values
我正在注册要为接口创建的实现。此实现构造函数具有三个参数:
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 is required to use (probably to inject) item
Abc.Data.TsqlConnection. To enable item use you may specify
container.With(rules =>
rules.WithItemToExpressionConverter(YOUR_ITEM_TO_EXPRESSION_DELEGATE)).
我已经阅读了这篇文章 SpecifyDependencyAndPrimitiveValues 并尝试像他们那样对其进行返工,但他们的示例只显示了原语或依赖关系,而不是两者,我找不到它们混合在一起而没有编译错误的语法.谁能给我一些关于如何注册这个实例的指导,指定两个字符串的值和依赖项的值?
操作方法如下(使用最新的 DryIoc v2.10.6):您不需要在参数中指定 c.Resolve<ISqlConnection>()
,只需使用 Arg.Of<ISqlConnection>()
:
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.
我正在注册要为接口创建的实现。此实现构造函数具有三个参数:
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 is required to use (probably to inject) item Abc.Data.TsqlConnection. To enable item use you may specify container.With(rules => rules.WithItemToExpressionConverter(YOUR_ITEM_TO_EXPRESSION_DELEGATE)).
我已经阅读了这篇文章 SpecifyDependencyAndPrimitiveValues 并尝试像他们那样对其进行返工,但他们的示例只显示了原语或依赖关系,而不是两者,我找不到它们混合在一起而没有编译错误的语法.谁能给我一些关于如何注册这个实例的指导,指定两个字符串的值和依赖项的值?
操作方法如下(使用最新的 DryIoc v2.10.6):您不需要在参数中指定 c.Resolve<ISqlConnection>()
,只需使用 Arg.Of<ISqlConnection>()
:
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.