StructureMap и многоуровневое решение MVC
У меня есть структура проекта следующим образом: Data Layer - для моделей MVC Website - для всех других сайтов, связанных с MVC.
Я хочу, чтобы мой контроллер вводил контекст базы данных и службу одновременно и все еще гарантировал внедрение зависимости.
Вот мой код My Controller:
private CMSDB _db;
public HomeController(CMSDB db)
{
_db = db;
}
Контекст моей базы данных
public class CMSDB : DbContext
{
public CMSDB() : base("DefaultConnection"){ }
public DbSet<Employee> Employees { get; set; }
public DbSet<Department> Departments { get; set; }
public DbSet<UserDatails> Users { get; set; }
public DbSet<UserRole> UserRoles { get; set; }
public DbSet<Module> Modules { get; set; }
}
Модель в отдельном проекте
public class Module : IModule
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
public virtual DateTime? DateCreated { get; set; }
public virtual string ModuleDescription { get; set; }
}
Мой интерфейс в одном проекте с моделью
public interface IModule
{ }
Я хочу, чтобы мой контроллер вводил CMSDB и IModule одновременно и по-прежнему обеспечивал внедрение зависимостей.
Важным фактором стало то, что позже можно было найти любое другое решение (возможно, портал). Все мнения приветствуются.
2 ответа
Убедитесь, что вы создаете отображение, которое должно выполняться при запуске
public static class ContainerBootstrapper
{
public static void BootstrapStructureMap()
{
// Initialize the static ObjectFactory container
ObjectFactory.Initialize(x =>
{
x.ForRequestedType<iNTERFACE>().TheDefaultIsConcreteType<ContreteClass>();
});
}
}
затем
iNTERFACE objectINMVCController = ObjectFactory.GetInstance<iNTERFACE>();
Хотя ответ, помеченный как правильный, будет работать, так как этот конкретный вопрос относится к StructureMap 3, стоит упомянуть, что использование StructureMap ObjectFactory
не рекомендуется и является устаревшим в версии 4 (как вы, без сомнения, увидите, когда попытаетесь построить свое решение).
Вместо этого лучшей альтернативой является использование StructureMap IContainer
интерфейс для создания ваших зависимостей с помощью приведенного ниже решения:
var container = new Container(x => {
x.For<IInterface>().Use<ConcreteClass>();
x.For<IInterface2>().Use<ConcreteClass2>();
});
Поскольку вы конкретно упоминаете возможность повторного использования, я бы посоветовал взглянуть на классы RegistryMap для StructureMap, которые позволяют инкапсулировать зависимости в реестре следующим образом:
public class WebsiteRegistry : Registry
{
public WebsiteRegistry()
{
For<ICustomerService>().Use<CustomerService>();
For<IProductServer>().Use<ProductService>();
}
}
Затем вы можете составить и зарегистрировать ваши классы реестра таким же образом, например, так:
IContainer container = new Container(x =>
{
x.AddRegistry<DatabaseRegistry>();
x.AddRegistry<WebsiteRegistry>();
});
Преимущество этого состоит в том, что вы можете разбивать классы реестра на основные зависимости, зависимости на основе веб-сайтов и зависимости от веб-служб. Например, и вашему веб-сайту, и веб-службе потребуется доступ к базе данных, поэтому это может войти в основной реестр, однако для вашего веб-сайта может потребоваться SessionRegistry
это было бы бесполезно в веб-сервисе (из-за бессессионной природы веб-сервиса).
Затем вам просто нужно зарегистрировать StructureMap в средстве разрешения зависимостей ASP.NET MVC в Global.asax.cs
учебный класс.