使用Ninject在类中注入字符串属性
本文关键字:注入 字符串 属性 Ninject 使用 | 更新日期: 2023-09-27 18:25:36
我的一个接口有一个字符串属性,该属性将取决于接口的使用位置。我希望避免每次创建对象时都对属性进行硬编码。我可以在构造函数中设置属性,但对象是使用工厂注入的。界面如下:
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;
}
然后在控制器级别使用Ninject注入。这是我的绑定
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每次将对象插入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
希望它能帮助