#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. Я создам пример приложения и опубликую код здесь.