powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / IoC. Постепенный перевод проекта. Возможно ли
22 сообщений из 47, страница 2 из 2
IoC. Постепенный перевод проекта. Возможно ли
    #38629032
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaНо тогда получается надо абстрагироваться от определенных репозиторий и передавать, например, IRepository, и уже в контроллере приводить его к типу IUserRepository.

этого точно делать не нужно.

но можно сделать так:

Код: c#
1.
2.
3.
            builder.RegisterGeneric(typeof(Repository<>))
                .As(typeof(IRepository<>))
                .InstancePerLifetimeScope();



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
   public class UsersController : Controller
   {
      ...
      public UsersController(IRepository<User> userRepository)
      {
          _userRepository = userRepository;
      }
      ...
   }



PavluhaПравильный ли данный подход или надо было не городить огород, а просто использовать абстрактную фабрику и все?

можно и так, но думаю приведение типов -- не лучший вариант использования возможностей DI. тем более такого, как Autofac. этот зверь много чего умеет.
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38629066
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,


Немного запутался... (((

Как мне тогда работать с шаблоном фабрики

В данном случае все понятно
Код: c#
1.
2.
3.
4.
public Controller(IRepository<User> userRepository)
		{
            _dataManager = DataManager;
		}



но есть и такое:
Код: c#
1.
2.
3.
4.
public Controller(IRepository<User> userRepository, IRepository<Audit> auditRepository)
		{
            _dataManager = DataManager;
		}



Фабрика не работает в таком случае, массив надо передавать или переписывать и дублировать методы репозиторий
Самый простой вариант это дублировать методы репозиторий (Их не очень много)
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38629074
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще вопрос по поводу этого:

Код: c#
1.
return Activator.CreateInstance(ControllerType, new ADM.Monitoring.Models.DataManager()) as Controller;



На вход тогда пойдет IRepository<>?
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38629113
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нашел пример для фабрики
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
builder.Register(s => new ControllerFactory()).As<IControllerFactory>();

 public ControllerFactory()
        {
            List<IController> lstControllers = DependencyResolver.Current.GetServices<IController>().ToList();
            _controllerMap = new Dictionary<string, Func<RequestContext, IController>>();

            foreach (Controller contr in lstControllers)
            {
                string ctrName = contr.ControllerContext.RouteData.Values["Controller"].ToString();
                _controllerMap.Add(ctrName, c => contr);
            }
        }



Почему contr.ControllerContext = null
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38629130
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaФабрика не работает в таком случае, массив надо передавать или переписывать и дублировать методы репозиторий
Самый простой вариант это дублировать методы репозиторий (Их не очень много)

почему не работает?


PavluhaНашел пример для фабрики

если используете Autofac, то не надо реализовывать свою фабрику контроллеров:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
protected void Application_Start()
{
    var builder = new ContainerBuilder();
    builder.RegisterControllers(typeof(MvcApplication).Assembly);
    var container = builder.Build();
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

    // Other MVC setup...



вот и всё в принципе, что нужно :)
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38629165
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,

Видимо я уже не догоняю.

Как контроллер на входе получит тогда ModelContext?
Если мы ничего и нигде не указали
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38629172
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha,

почитай пожалуйста https://code.google.com/p/autofac/wiki/MvcIntegration

там всё написано про интеграцию Autofac в ASP.NET MVC. лишних телодвижений совершать не нужно. просто регистрируй свои сервисы, об остальном уже позаботились :)
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38629201
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,

Основную идею я понял, но это частный случай.
И если я все правильно понял и у меня 2 фабрики:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
 if ()
            {
                ControllerBuilder.Current.SetControllerFactory(new ControllerFactory());
            }
            else
            {
                ControllerBuilder.Current.SetControllerFactory(new ErrorControllerFactory());
            }



и как вы пишите, что их не надо так добавлять
То тогда при конфигурировании я сам должен решить какая фабрика будет, а этим этого уже не решить
Код: c#
1.
builder.RegisterControllers(typeof(MvcApplication).Assembly);
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38629223
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaТо тогда при конфигурировании я сам должен решить какая фабрика будет, а этим этого уже не решить

блин, дак в этом и вся суть! в одном конкретном месте вы регистрируете нужные вам компоненты.

если поизучаете Autofac, то найдёте способы очень гибко конфигурировать создание объектов в момент их запроса на уровне регистрации компонентов.

сама возможность создавать фабрики контроллеров в MVC сделана для тестирования. никакого смысла создавать разные фабрики по какому-то условию нет. но и даже такой вариант использования можно провернуть в Autofac, не ковыряя фабрики.
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38630033
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,

Допустимо ли такое или это жесть:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
protected override IController GetControllerInstance(System.Web.Routing.RequestContext RequestContext, Type ControllerType)
{
	    if (ControllerType == null) return null;

	    var rd = RequestContext.RouteData;
	    string controller = rd.GetRequiredString("controller");
	    string actionName = rd.GetRequiredString("action");

            if (....) return null;
            if (....) return null;
            if (....) return null;

            List<String> list = new List<string>(new string[] { ...... });
            if (list.Contains(actionName) && ..................) return null;

            return Activator.CreateInstance(ControllerType, [color=red]DependencyResolver.Current.GetService<IDataManager>()[/color]) as Controller;
        }
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38630039
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaДопустимо ли такое или это жесть:

жесть :)

наверное стоит Activator.CreateInstance заменить на резолвинг с помощью DI.

а вообще, можно поинтересоваться, зачем вам понадобился свой GetControllerInstance? просто изучаете?
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38630046
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,

Есть 2 фабрики ControllerFactory, в зависимости от определенных условий, при старте системы подсовывается та или другая:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
 public static void Start() {
            ConfigureIoC();
 ViewEngines.Engines.Clear();
            if (.....)
            {
                ViewEngines.Engines.Add(new ThemedViewEngine());
                RouteConfig.RegisterRoutes(RouteTable.Routes);
                ControllerBuilder.Current.SetControllerFactory(new ControllerFactory());
            }
            else
            {
                ViewEngines.Engines.Add(new ErrorViewEngine());
                RouteConfig.RegisterCatchRoutes(RouteTable.Routes, message);
                ControllerBuilder.Current.SetControllerFactory(new ErrorControllerFactory());
            }
}

private static void ConfigureIoC()
        {
            var builder = new ContainerBuilder();
            builder.RegisterControllers(Assembly.GetExecutingAssembly());

            builder.RegisterType<ModelDataContext>().As<IModelDataContext>().InstancePerLifetimeScope();
            builder.RegisterType<ModelDataContextWrapper>().As<IModelDataContext>().InstancePerLifetimeScope();

            builder.RegisterType<DataManager>().As<IDataManager>().InstancePerHttpRequest();
            builder.RegisterType<AuditRepository>().As<IAuditRepository>().InstancePerHttpRequest();
            builder.RegisterType<CommandRepository>().As<ICommandRepository>().InstancePerHttpRequest();
            builder.RegisterType<CDMRepository>().As<ICDMRepository>().InstancePerHttpRequest();
            builder.RegisterType<MonitoringRepository>().As<IMonitoringRepository>().InstancePerHttpRequest();
            builder.RegisterType<RoleRepository>().As<IRoleRepository>().InstancePerHttpRequest();
            builder.RegisterType<SettingRepository>().As<ISettingRepository>().InstancePerHttpRequest();
            builder.RegisterType<UserRepository>().As<IUserRepository>().InstancePerHttpRequest();


            builder.RegisterFilterProvider();

            IContainer container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container)); 
        }
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38630110
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaЕсть 2 фабрики ControllerFactory, в зависимости от определенных условий, при старте системы подсовывается та или другая:

было бы конечно очень любопытно узнать для чего это всё. какие условия.

и да, в зависимости от этих условий можно регистрировать разные фабрики в DI.
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38630156
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVosttбыло бы конечно очень любопытно узнать для чего это всё. какие условия.


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


hVosttи да, в зависимости от этих условий можно регистрировать разные фабрики в DI.

А можно пример? Просто отказаться от них пока нет возможности, в них есть доп проверки на доступность тех или иных контроллеров от установленных настроек в системе
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38630163
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PavluhaА можно пример?

Вот здесь подробненько
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38634782
Евгений З
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все беды из-за того что не должно быть некого всеобъемлющего DataManager'а, сборной солянки из всех репозиториев. Обычная практика - создавать типы, отвечающие за определенный род деятельности и предоставляющие необходимое API. Например UserManager или UserService, который будет оперировать IUserRepository и IAuditRepository. Дальше к примеру операция создания юзера должна дернуть юзер репозиторий и записать это событие в аудит журнал. Все зависимости инжектить через конструктор без всяких там паблик свойств, т.е. юзер менеджер не должен давать доступ к своим репозиториям, он должен лишь иметь методы типа CreateUser, LoadUsers и т.д. Почитай про onion architecture, например тут http://www.develop.com/onionarchitecture
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38634795
Евгений З
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PavluhahVostt,


Немного запутался... (((

Как мне тогда работать с шаблоном фабрики

В данном случае все понятно
Код: c#
1.
2.
3.
4.
public Controller(IRepository<User> userRepository)
		{
            _dataManager = DataManager;
		}



но есть и такое:
Код: c#
1.
2.
3.
4.
public Controller(IRepository<User> userRepository, IRepository<Audit> auditRepository)
		{
            _dataManager = DataManager;
		}



Фабрика не работает в таком случае, массив надо передавать или переписывать и дублировать методы репозиторий
Самый простой вариант это дублировать методы репозиторий (Их не очень много)

Контроллер не должен оперировать репозиториями. Репозиторий должен тупо выполнять CRUD операции надо определенным типом сущности. Дальше должен быть сервис или менеджер типа UserService, который дергает нужные ему репозитории и содержит бизнес логику, транзакционные методы, батч операции и т.д.
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38634824
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Евгений З,

А он и не оперирует у меня сейчас.
Каждый контроллер получает на входе IDatamanager.
IDataManager имеет доступ к I....Repository, которая в свою очередь уже работает с данными.
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38635342
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, как лучше сделать "инъекцию" в UserProvider

Сейчас все выглядит так:

Код: c#
1.
2.
3.
internal class UserProvider : MembershipProvider
    {
        public IUserRepository Users { get; set; }




Как теперь настроить builder?
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38635358
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha
Код: c#
1.
MembershipProvider



зачем оно вам? мсу наслушались?
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38635372
Pavluha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hVostt,

У меня form-аутентификация с разными плюшками, поэтому и реализовал провайдер пользователей и ролей тоже. МСУ тут ни при чем

Я вроде решил проблему таким способом:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
            builder.Register(context => Membership.Provider).ExternallyOwned();
            builder.Register(context => Roles.Provider).ExternallyOwned();
            builder.RegisterType<UserProvider>();

            builder.RegisterFilterProvider();

            IContainer container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

            var lifetimeScope = DependencyResolver.Current.GetService<ILifetimeScope>();
            lifetimeScope.InjectProperties(Membership.Provider);
            lifetimeScope.InjectProperties(Roles.Provider);
...
Рейтинг: 0 / 0
IoC. Постепенный перевод проекта. Возможно ли
    #38635383
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pavluha,

ну можно так, с помощью ExternallyOwned
...
Рейтинг: 0 / 0
22 сообщений из 47, страница 2 из 2
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / IoC. Постепенный перевод проекта. Возможно ли
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]