1

我在一個項目中使用了結構圖和Asp .Net MVC。目前我正在MVC層中註冊我的依賴關係解決方案(服務,數據等)。但是,我想知道如何才能做到這一點,只需註冊MVC層下的什麼,即服務層。基本上我的控制器有服務注入到他們,這就是我想要我的UI層知道。在服務類中,我注入了庫,並希望那些在那裏註冊的結構圖......等等。換句話說,我希望每個圖層都只依賴(儘可能)直接位於其下面的圖層。 謝謝!structuremap asp .net mvc註冊

回答

1

我不確定我明白你在問什麼。

您必須註冊所有將要解析的對象。然後在您的控制器中,您只需要將ISomeService傳遞給構造函數。例如,控制器不知道ISomeService已經注入了IRepositories。

1

一個好方法是將結構圖約定與結構圖註冊表結合使用。這將處理您的大部分註冊問題。結構圖可以掃描你的bin,並映射它在bin中所有dll中找到的依賴關係。

查找到的掃描方法用StructureMap登記類組合:

Scan(x => 
{ 
    x.AssembliesFromApplicationBaseDirectory(y => 
     y.FullName.StartsWith("JustLookAtTheseDlls")); 

    // Use default conventions 
    x.WithDefaultConventions().OnAddedPluginTypes(y => 
     y.HybridHttpOrThreadLocalScoped()); 

    //Are there any registries? If so, register them 
    x.LookForRegistries(); 
} 

註冊表看起來像這一點,你能把一個到每個項目的每個註冊的項目:

public class IocRegistry : 
    StructureMap.Configuration.DSL.Registry 
{ 
    public IocRegistry() 
    { 
     For<IDocumentStore>().Singleton() 
      .Use<RavenStore>(); 
    } 
} 

您的根應用程序應具有包含上述掃描語句的註冊表。然後初始化structuremap像這樣:

ObjectFactory.Configure(x => x.AddRegistry(
    new MyTopLevelRegistry())); 

凡MyTopLevelRegistry看起來是這樣的:

public class MyTopLevelRegistry: Registry 
{ 
    public MyTopLevelRegistry() 
    { 
     Scan(x => 
     { 
      x.AssembliesFromApplicationBaseDirectory(
       y => y.FullName 
       .StartsWith("InsertYourNamespacePrefix")); 

      x.WithDefaultConventions().OnAddedPluginTypes(
       y => y.HybridHttpOrThreadLocalScoped()); 

      x.LookForRegistries(); 
     }); 
    } 
} 

請記住,如果你將其設置爲「WithDefaultConventions」它會自動映射到IMyClass這樣MYCLASS你甚至不必須在註冊表中指定這些內容。您只需註冊不符合該慣例的項目。

希望這會有所幫助!

2

我建議在自己的庫中使用composition root

在我正在研究的項目中,我們將StructureMap註冊表放入一個名爲xx.yy.IoC的庫中,我們從Global.asax調用配置代碼。

MVC圖層只有一個指向IoC庫的鏈接。 IoC庫依賴於其他層(域,數據等)

作爲提示:本文改變了我們對分層的看法。 jeffrey palermo onion architecture