2014-10-04 140 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。