Asp.net mvc 需要时创建对象的正确方法

Asp.net mvc 需要时创建对象的正确方法,asp.net-mvc,dependency-injection,ninject,Asp.net Mvc,Dependency Injection,Ninject,我正在学习Ninject作为我的第一个DI容器,我想所有容器都会有类似的想法,所以这里是我的问题 我有一个类UserRepository,它有一个函数: //constructor public UserRepository(Kernel kernel) { _kernel = kernel; } public UserDataModel CreateNewUser(string title, string firstname, string lastname, int age ..

我正在学习Ninject作为我的第一个DI容器,我想所有容器都会有类似的想法,所以这里是我的问题

我有一个类UserRepository,它有一个函数:

//constructor
public UserRepository(Kernel kernel) { _kernel = kernel; } 

public UserDataModel CreateNewUser(string title, string firstname,
    string lastname, int age ...) 
{
    //I have the kernel registered everything properly
    //Getting a new user object from the kernel
    var user = _kernel.Get<UserDataModel>(); 

    user.Title = title;
    user.Firstname = firstname;
    user.Lastname = lastname;
    ...
    return user;
} 

您应该注入依赖项,也称为依赖项注入。而不是注入内核

示例(这称为构造函数注入):

您可能应该为
UserDataModel
创建一个接口,以便在单元测试中模拟或存根它。并使用ninject将该接口绑定到正确的实现中,请参见示例。那么就不需要属性了

UserDataModels列表不是依赖项。也就是说,用户来自某种数据库或其他依赖关系(WCF服务、Web服务、实体框架、nHibernate等),这就是您的依赖关系



public UserRepository(EntityFrameworkContext context)
{
    //The entity framework context is the dependency that you don't want to test.
    _context = context;
}

public List GetAllUsers()
{
   return _context.Users.ToList();
}


预先定义了一个模型,并按常规注入,但它似乎并不能解决我的头痛问题。在运行时,如果我需要动态的东西,那该如何工作呢。比如说,我想要一个列表,在运行时请求之前不知道有多少。我不能只是公开用户存储库(列表);一开始呢?或者有些函数不需要它,我们还是注入它?在需要时询问内核不是更灵活吗?我最近几天阅读并下载的2个链接和示例代码。我看不到与此相关的直接示例。不应该传递内核。当您不知道内核将尝试要求什么时,如何设置单元测试?模拟内核也是一个愚蠢的想法。如果将所有依赖项传递给类,则可以完美地测试测试中的每个场景。如果你的班级变得一团糟,试着把问题分开。我知道这听起来是个坏主意。这就是我问的原因。如果某个函数生成一个列表,或者需要一个列表,这是非常常见的情况,不是吗?它并不凌乱。但这一切都是由运行时的用户动态请求完成的。在那之前,我不能预先制作一个未知的列表来注入。你能给我一个正确的例子说明它们通常是如何完成的吗?如果你只想创建一个UserDataModel,你可以创建一个新的UserDataModel()。因为用户数据模型不是依赖项。如果您想要更好的解决方案,请包含更多关于您试图实现的目标的示例代码。dependent对象描述了它依赖于哪个软件组件来完成其工作。注入器决定哪些具体类满足依赖对象的需求,并将它们提供给依赖对象。请参阅wikipedia:tempUser不是依赖项请勿将
内核
注入构造函数:。


private UserDataModel _userDataModel;

[Inject]
public UserRepository(UserDataModel userDataModel)
{
    _userDataModel = userDataModel;
}

//Any other method can now use _userDataModel



public UserRepository(EntityFrameworkContext context)
{
    //The entity framework context is the dependency that you don't want to test.
    _context = context;
}

public List GetAllUsers()
{
   return _context.Users.ToList();
}