Вот моя неполная конфигурация StructureMap:Конфигурация StructureMap для DI с компилятором asp.net MVC/Linq2Sql?
PS: Большие извинения за просим вас написать мое приложение для меня, но я найти StructureMap апи быть немного запутанным, как почти все, что я нахожу, когда я Google поиск ссылается к старшему апи.
public static void Configure(IContainer container)
{
container.Configure(c =>
{
string connectionString = ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString;
SQLDataContext dataContext = new SQLDataContext(connectionString);
c.For<SQLDataContext>().HttpContextScoped();
c.For<IAdminRepository>().Use<SQLAdminRepository_v2>().Ctor<SQLDataContext>().Is(dataContext);
c.For<IMemberRepository>().Use<SQLMemberRepository_v2>().Ctor<SQLDataContext>().Is(dataContext);
c.For<IUtilityRepository>().Use<SQLUtilityRepository_v2>().Ctor<SQLDataContext>().Is(dataContext);
c.For<IAdminService>().Use<AdminService_v2>();
c.For<IMemberService>().Use<MemberService_v2>();
c.For<IUtilityService>().Use<UtilityService_v2>();
c.For<ResourcePool>().Singleton();
});
}
У каждой службы есть зависимость от соответствующего репозитория, который передается через его конструктор. например :
public class ContactService_v2 : IContactService
{
IContactRepository contactRepository;
public ContactService_v2(IContactRepository contactRepository)
{
this.contactRepository = contactRepository;
}
public IQueryable<Contact> Get_Contacts()
{
return contactRepository.GetContacts();
}
public void Save_Contact(Contact contact)
{
contactRepository.Save_Contact(contact);
}
}
Таким образом, сервисный уровень представляет собой просто фасад с реальным хранилищем, лежащим за ним. [и до того, как вы спросите или предложите - Нет, я не буду менять это в спешке, потому что изначально я просто хочу, чтобы DI работала, чтобы проверить код, прежде чем начинать делать что-то драматическое.]
Q1: Приложение использует доступ к данным Linq2Sql. Очень важно, чтобы все Службы, отправленные каждому контроллеру, в зависимости от Репозитория зависели от одного и того же экземпляра контекста данных, потому что им может потребоваться присоединиться друг к другу в сложных запросах, сделанных в Репозиториях. Поэтому я хочу использовать жизненный цикл HttpContext для контекста данных. Является ли это (выше), как я это делаю?
Q2: ResourcePool используется для отслеживания одноэлементного паттерна, но я реорганизовал его на обычный класс, взяв одну службу в качестве параметра конструктора. Это правильно? В этом случае будет ли он вести себя так, как если бы он поступал из кэша приложений asp.net?
Q3: Каковы эквиваленты авторегистрации для конфигураций репозитория и службы? [PS: Да, я знаю, что суффикс «_v2» является нетрадиционным, но уже существуют эквиваленты оригинала для каждого XService и XRepository, которые я хочу реорганизовать на свой досуг после добавления DI и работает без проблем].
Asp.Net MVC позволяет иметь сильную модель связывания, как так:
[HttpPost]
public ActionResult List(AdminDisplay admin)
{
admin.GetAdminPage();
return View(admin);
}
В таком случае каждый класс (например, AdminDisplay) требует конструктор без параметров по умолчанию, так что рамки MVC можно создать. Более того, для любого класса, созданного внутри такого класса, связанного с моделью, также нужен такой конструктор без параметров.
Q4: Если я хочу заменить эти конструкторы без параметров, достаточно ли просто добавлять записи для них в код конфигурации StructurMap? - или мне это не нужно делать, если все эти классы привязки модели и их иждивенцы имеют конструкторы, которые используют только параметры, которые может разрешить StructureMap.
Извинения за плохое форматирование выше, но как отключить редактирование wysiwyg?
PS: Разрешено отвечать на любые вопросы Q1, Q2, Q3, Q4 без ответа на все из них!
Добро пожаловать в переполнение стека. У вас больше шансов получить ответы, если вы зададите несколько коротких вопросов, а не один длинный вопрос с множеством вопросов. Кроме того, если разрешено отвечать на любые (но не все) вопросы, то как вы собираетесь выбирать и принимать ответ? –
Thanks Mark, Как отмечено в последнем PS выше - приемлемо ответить на любой из этих вопросов индивидуально. – user1040323
Меня это немного беспокоило, потому что я думал, что это сломалось - но это было что-то в моем новом слое репо, который был сломан вместо этого! Приведенный выше код работает. Уф. Основное отличие заключается в том, что я должен установить время жизни для контекста данных перед вызовом экземпляра, например: 'code' c.For(). HttpContextScoped(); SQLDataContext dataContext = новый SQLDataContext (connectionString); 'code' –
user1040323