gpt4 book ai didi

c# - 使用 Ninject 在类中注入(inject)字符串属性

转载 作者:行者123 更新时间:2023-11-30 21:53:13 24 4
gpt4 key购买 nike

我的一个接口(interface)有一个字符串属性,它取决于接口(interface)的使用位置。我想避免每次创建对象时都对属性进行硬编码。我可以在构造函数中设置属性,但对象是使用工厂注入(inject)的。界面如下:

public interface IObjectStore
{
string StorageTableName { get; set;}

void UpdateObjectStore(string key, string value);

string ReadObjectStore(string key);
}

在服务中使用

public class CategoryService<T> : ICategoryService<T> where T : Company
{
private readonly IObjectStore objectStore;

public CategoryService(IObjectStore objStore)
{
this.objectStore = objStore;
objectStore.StorageTableName = "CategoryTable"; // I want to avoid this hard coding
}
...
}

服务是使用服务工厂(Ninject.Extensions.Factory)创建的

 public interface IServiceFactory
{
ICategoryService<T> CreateCategoryService<T>() where T : class;
}

然后在 Controller 级别使用 Ninject 注入(inject)。这是我的绑定(bind)

bool storeInNoSql = true;
kernel.Bind<IServiceFactory>().ToFactory().InSingletonScope();
kernel.Bind<ICategoryService<Article>>().To<CategoryService<Article>>();
kernel.Bind<IObjectStore>().ToMethod(ctx => storeInNoSql ? ctx.Kernel.Get<ObjectStore>() : null);

所以问题是:我如何告诉 Ninject 在每次将对象注入(inject) CategoryService 时将属性 StorageTableName 设置为“CategoryTable”,并在每次将其插入 ArticleService 时设置为“ArticleTable”?

最佳答案

我想这就是您要找的。
这只是我刚刚做的一个非常小的示例项目,但这应该可以解决您的问题。

public class Ninject_34091099
{
public static void Run()
{
using (IKernel kernel = new StandardKernel())
{
kernel.Bind<IInterface<Generic1>>()
.To<Class<Generic1>>()
.WithConstructorArgument("name", "STRING ONE");

kernel.Bind<IInterface<Generic2>>()
.To<Class<Generic2>>()
.WithConstructorArgument("name", "The other string");

kernel.Bind<IServiceFactory>().ToFactory().InSingletonScope();

var factory = kernel.Get<IServiceFactory>();
var c1 = factory.CreateInterface<Generic1>();
var c2 = factory.CreateInterface<Generic2>();

Console.WriteLine(c1.Name);
Console.WriteLine(c2.Name);
}

Console.WriteLine("Done");
Console.ReadLine();
}
}

public interface IInterface<T> where T : class
{
string Name { get; set; }
}

public class Generic1
{

}

public class Generic2
{

}

public class Class<T> : IInterface<T> where T : class
{
public string Name { get; set; }

public Class(string name)
{
Name = name;
}
}

public interface IServiceFactory
{
IInterface<T> CreateInterface<T>() where T : class;
}

抱歉,这些名字毫无意义:D
希望对你有帮助

关于c# - 使用 Ninject 在类中注入(inject)字符串属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34091099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com