System.web.Mvc DependencyResolver не может создать объект для универсальных классов

#c# #asp.net-mvc-3 #dependency-injection #dependency-resolver

#c# #asp.net-mvc-3 #внедрение зависимостей #определитель зависимостей

Вопрос:

Я пытаюсь использовать dependencyinjection в контроллере и использую System.Web.MvcDependencyResolver.Текущий.GetService() для создания экземпляров службы в классе контроллера.

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

 public interface IProfileManagementService
{
   IList<News> GetSavedSearchList(int userObjectId, ApplicationType applicationType,int? vendorUserObjectId);
}
  

и мой синтаксис распознавателя зависимостей, как показано ниже, дает мне экземпляр ProfileManagementService

 DependencyResolver.Current.GetService<IProfileManagementService>();
  

Но если я создам какой-либо универсальный интерфейс службы, как показано ниже,

 public interface ICommonProfileManagementService<T>
{
   IList<T> GetSavedSearchList(int userObjectId, ApplicationType applicationType,int? vendorUserObjectId);
}
  

Но я получаю null (объекты CommonProfileManagementService не создаются) для приведенного ниже кода

 DependencyResolver.Current.GetService<ICommonProfileManagementService<News>>();
  

Пожалуйста, предложите несколько альтернативных способов передачи

 IService<T>
  

вместо

 IService
  

для DependencyResolver.Текущий.GetService()

Комментарии:

1. Каков ваш текущий Resolver ? Как вы на самом деле регистрируете реализацию интерфейса?

Ответ №1:

Вот полный код, включая синтаксис, необходимый для возврата универсального из DependencyResolver .

 using Microsoft.Practices.Unity;
using System;
using System.Collections.Generic;
using System.Web.Mvc;
using Microsoft.Practices.Unity.Mvc;

namespace ConsoleApplication2
{
    class Program
    {
        public interface IService<T>
        {
            List<T> GetService();
        }

        public class Service<T> : IService<T>
        {
            public List<T> GetService()
            {
                return new List<T>();
            }
        }

        static void Main(string[] args)
        {
            var container = new UnityContainer();

            container.RegisterType(typeof(IService<>), typeof(Service<>));

            DependencyResolver.SetResolver(new UnityDependencyResolver(container));

            var service = DependencyResolver.Current.GetService(typeof(IService<string>));

            Console.WriteLine(service.ToString());

            Console.ReadKey();
        }
    }
}
  

Комментарии:

1. Я попробовал это, и он говорит, что имя интерфейса недопустимо на данный момент

2. Где вы настраиваете свой контейнер DI?

3. Кроме того, когда вы говорите: «это говорит», вы имеете в виду, что Visual Studio сообщает об этой ошибке и, следовательно, не позволяет вам компилировать. Или это ошибка во время выполнения?

4. С помощью синтаксиса он выдает ошибку времени компиляции. Также я не настраивал ни одного контейнера DI. . DependencyResolver определил метод расширения GetService (), который позволяет передавать только имя интерфейса. но он не может принимать T вместе с интерфейсом. Нужно ли мне настраивать контейнер DI и инициализировать его в appstart

5. Извините, я имел в виду, что вы должны заменить T на фактический тип, для которого вы хотите создать универсальный. Однако вам также необходимо реализовать контейнер и зарегистрировать его в DependencyResolver, иначе он всегда будет возвращать значение null. Я создам пример приложения и опубликую код здесь.