如何使用 ninject 将参数传递给自定义提供程序

How to pass an argument to custome provider using ninject

我有一个名为 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*/);

根据您的评论,您可以考虑使用可以传递到较低层的抽象

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...
}

并避免需要有提供者开始。