Конструктор DI + Unity 2.0 + проблема с разрешением зависимости - PullRequest
0 голосов
/ 05 декабря 2011

Контроллер:

public class HomeController : Controller
{
    IEmployeeTask _employeeTask;

    public HomeController()
    {
        _employeeTask = new UnityContainer().Resolve<IEmployeeTask>();
    }

    public HomeController(IEmployeeTask employeeTask)
    {
        _employeeTask = employeeTask;
    }

    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";

        return View();
    }       

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

    [HttpPost]
    public ActionResult GetAndDisplayEmployee(int empid)
    {            
        return View(_employeeTask.GetEmployeeModelFromService(empid));            
    }
}

Global.asax.cs:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
    var container = new UnityContainer();
    container.RegisterType<IEmployeeModelMap, EmployeeModelMap>();
    container.RegisterType<IEmployeeService, EmployeeService>();
    container.RegisterType<IEmployeeTask, EmployeeTask>();
    container.RegisterType<IEmployee, Employee>();
    DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}

Устранитель зависимостей Unity:

 public class UnityDependencyResolver : IDependencyResolver
 {
     readonly IUnityContainer _container;
     public UnityDependencyResolver(IUnityContainer container)
     {
         this._container = container;
     }
     public object GetService(Type serviceType)
     {
         try
         {
             return _container.Resolve(serviceType);
         }
         catch
         {
             return null;
         }
     }
     public IEnumerable<object> GetServices(Type serviceType)
     {
         try
         {
             return _container.ResolveAll(serviceType);
         }
         catch
         {
             return new List<object>();
         }
     }
 }

Класс задания сотрудника:

 public class EmployeeTask: IEmployeeTask
 {        
     IEmployeeService _employeeService;        
     IEmployeeModelMap _employeeModelMap;

     public EmployeeTask(IEmployeeService employeeService, IEmployeeModelMap employeeModelMap)
     {
         _employeeService = employeeService;
         _employeeModelMap = employeeModelMap;
     }

     public EmployeeViewModel GetEmployeeModelFromService(int empId)
     {
         return _employeeModelMap.ToModel(_employeeService.GetEmployeeFromEntities(empId));
     }
}

Теперь я использовал блок приложения Unity 2.0.Попытался разрешить зависимость контроллера, используя единство, без использования фабрики пользовательских контроллеров.Я застрял с ошибкой ниже.

Текущий тип, DataProviderInfrastructure.IEmployeeTask, является интерфейсом и не может быть создан.Вам не хватает отображения типов?

1 Ответ

0 голосов
/ 05 декабря 2011

Я не использую Unity, но я предполагаю, что он пытается использовать ваш конструктор без параметров, где вы пытаетесь разрешить зависимость. Создание этого конструктора очень и очень неправильно. Во-первых, он отрицает цель внедрения зависимостей, а во-вторых, вы создаете новый контейнер внутри, который будет пустым, поэтому он явно не сможет разрешить любые зависимости. Попробуйте удалить это из своего кода:

public HomeController()
{
    _employeeTask = new UnityContainer().Resolve<IEmployeeTask>();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...