2014-10-04 67 views
0

我有一个这样的结构项目: 数据层 - 对于模型 MVC网站 - 所有其他mvc网站相关。StructureMap和多层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; } 
} 

我与模型

同一项目界面
public interface IModule 
{ } 

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

重要的因素是能够产生任何其他解决方案(门户可能),从这以后。欢迎所有意见。

+0

我觉得我可以将'IModule'服务传递给控制器​​构造函数,IModule实现'CMSDB',挑战是模型'Module'和'IModule'在同一个项目中(一个库项目)我觉得虽然不合适。 – Peter 2014-10-04 14:59:47

+0

您是否知道“MVC”是一种与语言无关的架构模式,并且**不是框架的名称**? – 2014-10-04 15:00:44

+0

我想你是问这是因为我的网站命名?那么,我完全理解。我只将它命名为MVC网站,以提醒自己我已将其作为设计模式。 – Peter 2014-10-04 15:07:33

回答

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

虽然答案标记为正确答案将工作的映射,因为这个特殊的问题是有关StructureMap 3值得一提的是,不建议使用StructureMap的ObjectFactory,事实上在版本4中不推荐使用(因为当您尝试构建解决方案时,您肯定会看到这一点)。

取而代之的是更好的替代方法是使用StructureMap的​​接口,通过下面的解决方案来撰写你的依赖:

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

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