Как передать аргумент обычному провайдеру с помощью ninject - PullRequest
1 голос
/ 20 января 2020

У меня есть служба под названием MyRepository, я должен был написать свой собственный провайдер для MyRepository. Как я могу передать аргумент конструктору MyRepository с помощью провайдера?

Это мой код:

public class MyRepository : IMyRepository
{
    private string _path;

    public MyRepository(string path)
    { 
        _path = path;
    }

    // more code...
}

public class MyRepositotyProvider : Provider<IMyRepositoty>
{
    public static IMyRepositoty CreateInstance()
    {
        return new MyRepository(/*how to pass an argument?*/);
    }

    protected override IMyRepositoty CreateInstance(IContext context)
    {
        // I need to pass path argument?
        return CreateInstance();
    }
}

// I need to pass the path argument to the provider
var instance = OrganisationReportPersisterProvider.CreateInstance(/*pass path arg*/);

1 Ответ

1 голос
/ 21 января 2020

Исходя из вашего комментария, вы можете рассмотреть возможность использования абстракции, которая может быть передана нижним уровням

public interface ISomeSetting { 
    string Path { get; } 
}

и затем может быть решена с помощью контекста в поставщике

public class MyRepositotyProvider : Provider<IMyRepositoty> {

    public static IMyRepositoty CreateInstance(string path) {
        return new MyRepository(path);
    }

    protected override IMyRepositoty CreateInstance(IContext context) {
        ISomeSetting setting = context.Kernel.Get<ISomeSetting>()
        var path = setting.Path;
        return CreateInstance(path);
    }
}

Реализация будет находиться на более высоком уровне и позволяет отделяться.

В идеале хранилище могло бы быть реорганизовано, чтобы зависеть от абстракции

public class MyRepository : IMyRepository {
    private readonly string _path;

    public MyRepository(ISomeSetting setting)  
        _path = setting.Path;
    }

    // more code...
}

и избежать необходимости иметь провайдера для начала .

...