0

我有一个类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 的新实例,但 Ninject 不会绑定正确的类 - 导致构造函数不正确 :( 并且会引发NullReference 异常。

我试图创建构造函数链:

public LkCredentials() : this((ICustomer)null)
{ }

但它没有用。我可以做些什么让 Ninject 正常工作?有任何想法吗?

PS:

Ninject 作为MVC Extension安装。控制器中的 Ninject 注入效果很好,具有相同的绑定。

来自NinjectWebCommon.cs的 Ninject 绑定:

    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>();
        }
    }
4

2 回答 2

0

我按原样保留了无参数构造函数,但在需要 a 的第一点,Customer我添加了:

        if (this.Customer == null)
            this.Customer = (ICustomer)System.Web.Mvc.DependencyResolver.Current.GetService(typeof(ICustomer));

这已经足够了。非常感谢 Stephen Byrne,他给了我很好的建议!

于 2013-10-25T08:15:47.730 回答
0

我是 Ninject 的学生,非常喜欢它。我认为问题是您需要将 LkCredentials 绑定到 ILkCredentials 并使用参数绑定它。像这样的东西:

Bind<ILkCredentials>().To<LkCredentials>().WithConstructorArgument("Customer", "Customer");

在 WithConstructorArgument(, ) 中。这有点令人困惑,因为您的参数名称也是您要注入的对象的名称。

这是另一个示例,其中参数名称为“name”,构造函数参数为“Fender”:

Bind<IGuitar>().To<Guitar>().WithConstructorArgument("name", "Fender");

希望有帮助。

于 2013-10-22T13:13:36.990 回答