#c# #.net #asp.net #asp.net-mvc-3 #asp.net-membership
#c# #.net #asp.net #asp.net-mvc-3 #asp.net-членство
Вопрос:
Я разрабатываю приложение со следующими уровнями
- Уровень данных (с общим репозиторием поверх EF 4.1)
- Уровень обслуживания — вся бизнес-логика идет сюда
- ASP.NET Веб-сайт MVC 3 и ServiceStack.СЕТЕВЫЕ веб-службы
Я пытаюсь реализовать пользовательский поставщик членства для использования моих сервисов / репозиториев
Моим первоначальным решением было вызвать методы уровня обслуживания из поставщика, но, конечно, я не могу использовать DI (через Ninject), поскольку членство обрабатывается фреймворком и не позволяет мне использовать внедрение конструктора.
Я попытался создать экземпляр моего класса UserService в методе initialize в поставщике через:
userService = (UserService)Activator.CreateInstance(typeof(UserService));
Но, учитывая, что обслуживание пользователей зависит от репозитория, вводимого Ninject, это не работает, поскольку репозиторий никогда не вводится.
Чего мне здесь не хватает? каков самый простой способ обойти эту проблему? Должен ли я подходить к этому с совершенно другой точки зрения?
РЕДАКТИРОВАТЬ: вот мой пользовательский сервис по запросу
public class UserService : IUserService
{
private readonly IUserRepository userRepository;
private readonly IUnitOfWork unitOfWork;
public UserService(IUserRepository userRepository, IUnitOfWork unitOfWork)
{
this.userRepository = userRepository;
this.unitOfWork = unitOfWork;
}
//methods(AddUser, etc.)...
}
Комментарии:
1. DI существует только на вашем верхнем уровне, верно? Вам не нужен DI в остальных ваших слоях. По началу я ссылаюсь на ваше приложение MVC.
2. На самом деле я использую DI во всех слоях для введения зависимостей между слоями. Классы уровня обслуживания зависят от репозиториев, поэтому уровни обслуживания строятся вокруг интерфейсов, а конкретные репозитории вводятся. DI настраивается только на верхнем уровне в global.asax, если это то, что вы имеете в виду? Является ли мой метод плохой практикой?
3. На самом деле, вся моя архитектура смоделирована после этого примера: efmvc.codeplex.com Только я использую Ninject вместо Unity
4. Архитектура звучит нормально, я просто хотел проверить, что вы выполняете только фактическую часть внедрения (используя DI framework) на своем уровне MVC, а не на других уровнях.
5. Не могли бы вы показать нам код вашего пользовательского сервиса, пожалуйста.
Ответ №1:
Если ваша основная проблема заключается в тестировании и обеспечении работы вашего DI, то одним из вариантов является фасад битов членства и создание интерфейса вне фасада. Затем вы можете настроить модульные тесты и даже использовать некоторый тип библиотеки контейнеров IoC (DI).
Комментарии:
1. Возможно, у меня есть один в каком-то старом коде, который я сделал, но я не уверен, что он у меня все еще есть. Я посмотрю, но это будет в эти выходные. Однако у меня есть примеры других типов фасадов, если концепции достаточно для запуска.