Использование DryIoc с зависимостью и примитивными значениями

Я регистрирую реализацию, которая будет создана для интерфейса. Этот конструктор реализаций имеет три параметра:

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. Чтобы включить использование элемента, вы можете указать container.With(rules => rules.WithItemToExpressionConverter(YOUR_ITEM_TO_EXPRESSION_DELEGATE)).

Я прочитал это SpecifyDependencyAndPrimitiveValues и попытался переработать его, как они сделали, но их пример показывает только это с примитивами или с зависимостями, а не с обоими, и я не могу найти синтаксис, в котором они смешиваются без ошибок компиляции. Может ли кто-нибудь дать мне несколько советов о том, как зарегистрировать этот экземпляр, указав значения для двух строк и значение для зависимости?


person Richard Mannion    schedule 02.05.2017    source источник
comment
Какую версию DryIoc вы используете?   -  person dadhi    schedule 03.05.2017


Ответы (1)


Вот как вы это делаете (используя последнюю версию 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)));

Вот живое доказательство.

person dadhi    schedule 03.05.2017
comment
Интересно, что моя регистрация службы работает в вашем примере кода. Тогда я не уверен, проблема ли в версии или в том, что я работаю над проектом WebAPI. Я посмотрю на это сегодня вечером и попробую ваш код, спасибо. - person Richard Mannion; 03.05.2017
comment
Ваш код полностью решил проблему, спасибо. Правильно ли я говорю, что моя проблема заключается в том, что для уже определенного разрешения зависимостей вам не нужно указывать Arg.Index, и я определяю, что это представляет проблему? - person Richard Mannion; 03.05.2017
comment
Я еще не уверен, потому что поведение немного изменилось с новыми версиями. Но изначально (в ранних версиях) это было бы проблемой. - person dadhi; 04.05.2017