IService构造函数不构造

时间:2011-03-30 13:23:34

标签: c# asp.net-mvc dependency-injection constructor repository

对于模糊的标题,我们深表歉意。我会解释我正在努力工作的内容。

我的管理员视图使用管理员ViewModel,后者又调用Admin Service,后者是Admin Repositories的集合。为简单起见,我们假设Admin Service只引用了一个存储库。

构建我的管理视图模型时,我的班级顶部看起来像这样

public class adminMenuVM
{
    private readonly IAdminMenuService menuService;

    public adminMenuVM(IAdminMenuService adminMenuService)
    {
        this.menuService = adminMenuService;
    }

    public adminMenuVM()
    {
        menuItems = getMenuItems();
        menuCats = getMenuCats();
    }
}

其中getMenuItems和getMenuCats是两种使用该服务检索数据的方法,然后为视图模型设置这些数据。

我的问题是,当我运行应用程序时,我收到错误“对象引用未设置为对象的实例”。现在我知道这是因为adminMenuVM()是由viwModel调用的,而不是初始化服务的构造函数。

我的问题是如何在调用视图模型时确保调用服务构造函数并执行其操作?

我已尝试使用:这在无参数构造函数上,但它不允许我分配接口,因为您无法创建接口的新实例。

编辑@ 18:49 我有一个想法,但不知道如何实现它。任何人都可以建议我如何“构造链”或是否可能?我的想法是将无参数构造函数链接到服务构造函数,以确保它被调用。我可能会离开,但会感激你的帮助。

3 个答案:

答案 0 :(得分:1)

第一个构造函数看起来应该被某个Dependency Injection容器使用。

您只能使用一个构造函数来创建实例。当DI使用提供的“IAdminMenuService”创建实例时,您可以使用第二个构造函数创建新实例,但由于这是一个新实例,“menuService”将为空(null)。

您需要了解如何从DI容器中获取adminMenuVM的tan实例(如果这是您使用的)。

答案 1 :(得分:0)

删除该默认构造函数,并将其内容放入带有参数的构造函数中。

答案 2 :(得分:0)

管理好了解决这个问题。它不是最干净的解决方案,但我看不到任何其他方法。我会坚持这个来帮助遇到这个问题的其他人。

问题归结为将服务接口的当前实例传递给ViewModel。我能找到实例的唯一地方是我的控制器的构造函数。因此,我非常简单地声明了接口服务类型的公共全局变量,并将实例保存到该变量。当前实例持久化并可以传递给我的viewmodel的构造函数并满足viewmodel构造函数的要求。为了澄清我已经包含了一个控制器和一个视图模型的例子。

控制器:

public class AdminController : Controller
{
    private readonly IAdminMenuService lmService;
    public IAdminMenuService testService;

    public AdminController(IAdminMenuService layoutMarkupService)
    {
        this.lmService = layoutMarkupService;
        testService = lmService;
    }

    public ActionResult Index()
    {
        return View();
    }

    public PartialViewResult menuPartial()
    {
        return PartialView("_AdminMenuPartial", new adminMenuVM(testService));
    }

视图模型:

public class adminMenuVM
{
    private readonly IAdminMenuService menuService;

    public adminMenuVM(IAdminMenuService AdminMenuService)
    {
        this.menuService = AdminMenuService;
        menuItems = getMenuItems();
        menuCats = getMenuCats();
    }
}