2017-05-22 76 views
1

我目前正在使用StructureMap設置ASP.Net核心架構。我的層是:StructureMap:自我註冊實現的層接口

  • API(REST-連接,控制器,安全等)
  • 邏輯(應用層與邏輯)
  • 數據訪問(Repository模式與DocumentDB工作)
  • 模型
  • 常見

我想不跳層,因此他們之間的知識:

  • 阿比知道邏輯,型號,普通
  • 邏輯知道數據訪問,型號,普通
  • 數據訪問知道型號,普通
  • 型號都知道沒有人
  • 常見知道型號

我的問題:我通過Scan-Conventions註冊StructureMap:

internal static IServiceProvider ConfigureIoC(IServiceCollection services) 
{ 
    var container = new Container(); 

    container.Configure(
     config => 
     { 
      config.Scan(
       _ => 
       { 
        _.AssembliesFromApplicationBaseDirectory(); 
        _.AddAllTypesOf(typeof(IRepository<>)); 
        _.WithDefaultConventions(); 
       }); 

      config.Populate(services); 
     }); 

    var result = container.GetInstance<IServiceProvider>(); 
    return result; 
} 

我的問題,我想註冊一些服務在DataAccess層作爲單身人士。但是由於API不知道任何事情,所以我不能在這裏說。 我通常的做法是創建一個標記接口,通過反射加載所有的人,並呼籲他們,例如:

public class ServiceRegistration : Common.ServiceProviding.Initialization.IRegisterServices 
{ 
    public void RegisterServices(IServiceCollection serviceCollection) 
    { 
     serviceCollection.AddScoped<Logics.Integration.Rest.IRestProxy, Rest.Implementation.RestProxy>(); 
    } 
} 

我找不到一些現成的可能性StructureMap,但由於它們已經增加了掃描裝配等功能,我想我錯過了一些功能,這可能會使這項工作,或者有其他的可能性?

回答

1

您可以在DataAcess層定義一個自定義註冊表。

public class DataAccessRegistry : Registry { 
    public DataAccessRegistry() { 
     For<IWidget>().Singleton().Use<DefaultWidget>(); 
    } 
} 

然後用_.LookForRegistries()

+0

非常感謝爲您掃描的掃描方法所有登記冊,這似乎是要走的路。最後一個問題:似乎在另一個註冊表中使用Scan並不是開箱即用,是不是某種已知的限制? –

+0

不太確定我理解這個問題。 「使用其他註冊表掃描」是什麼意思? – Robban

+0

在原始解決方案中,我直接在創建容器的位置使用掃描,如我的文章所示。但是當我在我的自定義註冊表中做同樣的事情時,它並沒有註冊IRepository實現,儘管它是完全相同的代碼。唯一不同的是,它現在從我的自定義註冊表掃描。 –

相關問題