1

Вот моя неполная конфигурация 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 без ответа на все из них!

+2

Добро пожаловать в переполнение стека. У вас больше шансов получить ответы, если вы зададите несколько коротких вопросов, а не один длинный вопрос с множеством вопросов. Кроме того, если разрешено отвечать на любые (но не все) вопросы, то как вы собираетесь выбирать и принимать ответ? –

+0

Thanks Mark, Как отмечено в последнем PS выше - приемлемо ответить на любой из этих вопросов индивидуально. – user1040323

+0

Меня это немного беспокоило, потому что я думал, что это сломалось - но это было что-то в моем новом слое репо, который был сломан вместо этого! Приведенный выше код работает. Уф. Основное отличие заключается в том, что я должен установить время жизни для контекста данных перед вызовом экземпляра, например: 'code' c.For (). HttpContextScoped(); SQLDataContext dataContext = новый SQLDataContext (connectionString); 'code' – user1040323

ответ

1

Q1: Изменение кода для контекста данных из:

SQLDataContext dataContext = new SQLDataContext(connectionString); 
c.For<SQLDataContext>().HttpContextScoped(); 

к:

c.For<SQLDataContext>().HybridHttpOrThreadLocalScoped() 
.Use(() => new SQLDataContext(connectionString)); 

Изменение кода для каждого хранилища из:

c.For<IAdminRepository>().Use<SQLAdminRepository_v2>() 
.Ctor<SQLDataContext>().Is(dataContext); 

к:

c.For<IAdminRepository>().Use<SQLAdminRepository_v2>() 
.Ctor<SQLDataContext>(); 
Смежные вопросы