IService Constructor не строит - PullRequest
       19

IService Constructor не строит

0 голосов
/ 30 марта 2011

Извините за смутное название.Я объясню, что я пытаюсь заставить работать.

My Admin View использует Admin ViewModel, которая, в свою очередь, вызывает Admin Service, которая является набором Admin Repositories.Для простоты скажем, что существует только один репозиторий, на который ссылается Admin Service.

При построении модели Admin View верхняя часть моего класса выглядит следующим образом

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 ]

1 голос
/ 30 марта 2011

Первый конструктор выглядит так, как будто он должен использоваться каким-то контейнером Dependency Injection.

Вы можете использовать только один конструктор для создания экземпляра. Когда этот DI создает экземпляр с предоставленным «IAdminMenuService», вы можете создать новый экземпляр с помощью второго конструктора, но, поскольку это новый экземпляр, «menuService» будет пустым (нулевым).

Вам нужно будет узнать, как получить tan экземпляр вашего adminMenuVM из контейнера DI (если это то, что вы используете).

0 голосов
/ 31 марта 2011

удалось выяснить это.Это не самое чистое решение, но я не вижу другого способа сделать это.Я добавлю это, чтобы помочь всем, кто сталкивается с этой проблемой.

Проблема сводилась к передаче текущего экземпляра интерфейса службы в 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));
    }

ViewModel:

public class adminMenuVM
{
    private readonly IAdminMenuService menuService;

    public adminMenuVM(IAdminMenuService AdminMenuService)
    {
        this.menuService = AdminMenuService;
        menuItems = getMenuItems();
        menuCats = getMenuCats();
    }
}
0 голосов
/ 30 марта 2011

Удалите этот конструктор по умолчанию и поместите его содержимое в конструктор с параметром.

...