处理 Ninject 绑定和无参数构造函数
本文关键字:参数 构造函数 Ninject 绑定 处理 | 更新日期: 2023-09-27 18:36:20
我有一个类LkCredentials,用于存储SQL表中的数据。
[Table(Name = "Credentials")]
public class LkCredentials : LkTable
{
// Database fields
[Column(Name = "id", IsPrimaryKey = true)]
public Binary Uid { get; set; }
...
// Used for dependency injection through Ninject
public ICustomer Customer { get; set; }
public LkCredentials(ICustomer Customer)
{
this.Customer = Customer;
}
// Data loader from database
public void Load(string login)
{
var user = (new SqlTRepository<LkCredentials>()).DBObject.Where(x => x.Login == login).Single();
... // copying data from user to this
}
我正在使用 Ninject 以这种方式注入适当的 ICustomer 类:
// Create new instance for correct constructor to run and Ninject to resolve
var cred = new LkCredentials((ICustomer)null);
// Load data from database
cred.Load(model.UserName);
但是在加载数据(void Load
)的过程中,在变量用户中创建LkCredentials的新实例,编译器需要定义无参数构造函数。如果我创建无参数构造函数,那么它将用于创建 LkCredentials的新实例,但 Ninject 不会绑定正确的类 - 导致构造函数不正确:(并且将引发空引用异常。
我尝试创建构造函数链:
public LkCredentials() : this((ICustomer)null)
{ }
但它没有用。我能做些什么来让 Ninject 正常工作?有什么想法吗?
附言:
Ninject 作为 MVC 扩展安装。控制器中的 Ninject 注入效果很好,具有相同的绑定。
Ninject bindings from NinjectWebCommon.cs:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<ICustomer>().ToProvider<ObjectProvider<ICustomer, Customer, Customer82>>();
kernel.Bind<IAddress>().ToProvider<ObjectProvider<IAddress, Address, ContactInfo>>();
}
public class ObjectProvider<T1,T2,T3> : IProvider
{
public Type Type { get { return typeof(T1); } }
public object Create(IContext context)
{
var securityInfo = context.Kernel.Get<SecurityInformation>();
if (securityInfo.isAuthenticated & securityInfo.DatabaseType == "81")
return context.Kernel.Get<T2>();
else if (securityInfo.isAuthenticated & securityInfo.DatabaseType == "82")
return context.Kernel.Get<T3>();
else
return context.Kernel.Get<T2>();
}
}
我是Ninject的学生,非常喜欢它。我认为问题是您需要将 LkCredentials 绑定到 ILkCredentials 并使用参数绑定它。像这样:
Bind<ILkCredentials>().To<LkCredentials>().WithConstructorArgument("Customer", "Customer");
在 WithConstructorArgument(, ) 中。这有点令人困惑,因为您的参数名称也是要注入的对象的名称。
下面是另一个示例,其中参数名称为"name",构造函数参数为"Fender":
Bind<IGuitar>().To<Guitar>().WithConstructorArgument("name", "Fender");
希望有帮助。
我按原样保留了无参数构造函数,但是在第一点,需要Customer
的地方,我添加了:
if (this.Customer == null)
this.Customer = (ICustomer)System.Web.Mvc.DependencyResolver.Current.GetService(typeof(ICustomer));
这就够了。非常感谢斯蒂芬·伯恩,他给了我很好的建议!