Как настроить Ninject для ASP.NET MVC с использованием LinqToSQL и шаблона репозитория - PullRequest
1 голос
/ 19 июля 2010

Я провел некоторый поиск, но не смог выяснить, как связать контексты данных LinqToSql с указанными строками соединения в разные репозитории.

Это связывание выполняется в global.ajax при регистрации маршрутов.Я использую довольно стандартный шаблон репозитория, чтобы отделить инфраструктуру LinqToSql от моего приложения, чтобы я мог изменить технологическую инфраструктуру в будущем (NHibernate, EntityFramework и т. Д.).Кроме того, сделайте мой код легко тестируемым и поддающимся проверке модулем.

У меня есть что-то вроде этого.

string desktopConnectionString = ConfigurationManager.ConnectionStrings["Desktop"].ConnectionString;
string messagingConnectionString = ConfigurationManager.ConnectionStrings["MessageQueue"].ConnectionString;
string usersConnectionString = ConfigurationManager.ConnectionStrings["Users"].ConnectionString;

// Map linqToSql entity types to interfaces
TableMapper typeFinder = new TableMapper();
typeFinder.Define<EzsDashboard>().As<IDashboard>();
typeFinder.Define<EzsDashboardGadget>().As<IGadget>();
typeFinder.Define<EzsDashboardGadgetAssignment>().As<IGadgetAssignment>();
...

IDesktopRepository dr = new DesktopRepository(new LinqToSqlDataSource(new DataContext(desktopConnectionString), typeFinder)));
Bind<IDesktopRepository>().ToConstant(dr).InRequestScope();

IUserRepository ur = new UserRepository(new LinqToSqlDataSource(new DataContext(usersConnectionString), typeFinder)));
Bind<IUserRepository>().ToConstant(ur).InRequestScope();

IMessageRepository mr = new MessageRepository(new LinqToSqlDataSource(new DataContext(messagingConnectionString), typeFinder)));
Bind<IMessageRepository>().ToConstant(mr).InRequestScope();

Хотя это работает физически.Я нахожу данные в моем приложении asp.net MVC часто возвращается устаревшим.Например, я добавлю гаджет на панель инструментов, которую он отображает, и если я проверю базу данных, она была правильно сохранена в базе данных.Я перезагружаю страницу, и приборная панель ничего не показывает.При щелчке по приложению иногда происходит его «обновление», и сохраненные данные отображаются.

Еще один способ увидеть это, если я внесу изменения в свой файл web.config и инициирую повторную загрузку приложения,Когда я нажимаю на панель управления, все отображается точно так, как и должно.

Может кто-нибудь помочь с привязкой строки соединения-> DataContext-> LinqToSqlDataSource-> DomainRepository

Ответы [ 2 ]

1 голос
/ 19 июля 2010

Мне кажется, что ваши репозитории превышают ожидаемый объем. Правильно ли я предполагаю, что код в вашем вопросе находится в модуле Ninject или глобальное приложение запускается? Если это так, я бы поменял каждую из ваших привязок на что-то вроде этого:

Bind<IDesktopRepository>().ToMethod(context => new DesktopRepository(new LinqToSqlDataSource(new DataContext(desktopConnectionString), typeFinder)))).InRequestScope();

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

0 голосов
/ 19 июля 2010

Я набрал это, но, подумав, я понятия не имею, о чем вы спрашиваете ... Не могли бы вы уточнить:

  • на высоком уровне, чего достигают эти строки подключения в вашем приложении
  • что, по вашему мнению, идет не так в вашей системе?
  • Вы чувствуете, что это проблема ASP.NET или проблема DI? Вы что-то делаете в сеансе и т. Д.?

Вам нужно вспомнить такие вещи (если я правильно понял, что вы хотите динамически изменять механизм хранения вашего приложения на лету - вы указали, что делаете, а не почему вы это делаете) в качестве логики приложения.

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

Вспомните случай, когда вы переключаете хранилище с A на B. Что, если что-то в вашем приложении связывается с A в середине вашей операции и собирается повторить попытку? Вы не хотите, чтобы контейнер (или кто-либо еще) передавал ему букву B.

Это не означает, что не существует законных вариантов использования таких вещей. Просто они определенно не являются частым случаем или чем-то, чем обычно управляют DI-контейнеры.

... Или я могу что-то упустить - в этом случае было бы интересно узнать больше о вашей схеме и о том, как вы пытаетесь сопоставить вещи с областями действия и т. Д.

...