如何使用 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...
}
并避免需要有提供者开始。
我有一个名为 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...
}
并避免需要有提供者开始。