StructureMap和多层MVC解决方案

时间:2014-10-04 14:51:15

标签: c# asp.net-mvc structuremap3

我有一个这样的结构项目: 数据层 - 用于模型 MVC网站 - 与所有其他mvc网站相关。

我希望我的控制器同时注入数据库上下文和服务,并且仍然确保依赖注入。

这是我的代码 我的控制器:

  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; }
} 

我在与Model

相同的项目中的界面
 public interface IModule
 {    }

我希望我的控制器能够同时注入CMSDB和IModule,并且仍然确保依赖注入。

重要的因素是能够在以后解决任何其他解决方案(可能是门户网站)。欢迎所有意见。

2 个答案:

答案 0 :(得分:1)

确保您正在创建应该在启动时运行的映射

   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>();

答案 1 :(得分:1)

虽然标记为正确答案的答案可行,但由于此特定问题与StructureMap 3有关,因此值得一提的是,不推荐使用StructureMap&#39; ObjectFactory,因此不推荐使用在版本4中(因为您在尝试构建解决方案时毫无疑问会看到)。

相反,更好的选择是使用StructureMap的IContainer接口通过以下解决方案构建您的依赖项:

var container = new Container(x => {
    x.For<IInterface>().Use<ConcreteClass>();
    x.For<IInterface2>().Use<ConcreteClass2>();
}); 

当你特别提到可重用性时,我建议你看一下StructureMap's Registry classes,它允许你将依赖项封装在一个注册表中,如下所示:

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>();
});

这样做的好处是可以将注册表类分解为核心依赖项,基于网站的依赖项和Web服务依赖项。例如,您的网站和Web服务都需要数据库访问,因此这可能会进入核心注册表,但是您的网站可能需要SessionRegistry在Web服务中无用(由于Web服务&#39;无会话的性质。)

然后你只需要在Global.asax.cs类中使用ASP.NET MVC的依赖解析器注册StructureMap。