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 учебный класс.

Другие вопросы по тегам