StructureMap поддерживает две формы внедрения зависимостей:
- Внедрение в конструктор - «Заставить» зависимости в конкретный класс с помощью аргументов конструктора.
- Setter Injection - «Перетаскивание» зависимостей в конкретный класс через открытые свойства. Номенклатура "Сеттер" взята из
Java, где свойствами являются getSomething () и setSomething (value).
Я добился отличных результатов, используя конфигурацию, подобную следующей:
// In my projects, I have something like a DataContext (IDataContext's implementation) expose my ObjectContext...
// * You don't need to HttpContextScope everything, usually the ObjectContext is sufficient
For<ObjectContext>()
.HttpContextScoped()
.Use<MembershipEntities>()
.Ctor<string>("connectionString")
.Is("name=MembershipEntities")
.Named(MembershipObjectContextInstanceKey);
// Usually, I don't abstract or wrap the ObjectContext, it is simply injected, under the hood
// ObjectContextAdapter receives an ObjectContext (HttpContextScoped)
For<IObjectContext>().Use<ObjectContextAdapter>();
// Ctor receives a IObjectContext
// * Again, if you have absolutely no use for IObjectContext, it shouldn't exist and UnitOfWork's ctor should receive the HttpContextScoped ObjectContext
For<IUnitOfWork>().Use<UnitOfWork>();
// Ctor receives a IObjectContext [...]
For(typeof(IRepository<>)).Use(typeof(Repository<>));
Это более или менее так, как я это делаю, каждый раз.
Дайте мне знать, если это работает для вас.
С уважением,
Max