簡體   English   中英

基於派生類型的StructureMap開放泛型使用

[英]StructureMap Open Generics Use Based on Derived Type

我有兩個實體基類:

public abstract class EntityBase { }
public abstract class ClientSpecificEntityBase : EntityBase

和兩類實體:

public class Thing : EntityBase { }
public class ClientSpecificThing : ClientSpecificEntityBase { }

和兩種類型的服務,都實現了IService<T>

ServiceBase<T> : Service<T> where T : EntityBase
ClientSpecificServiceBase<T> : ServiceBase<T> where T : ClientSpecificEntityBase 

我正在使用以下代碼來配置StructureMap:

_.For(typeof(IService<>)).Use(typeof(ServiceBase<>));
_.For<IService<ClientSpecificEntityBase>>().Use<ClientSpecificServiceBase<ClientSpecificEntityBase>>();

但是每次我嘗試訪問IService<ClientSpecificThing>

public ClientSpecificThingController(IService<ClientSpecificThing> service)

我正在獲取ServiceBase<ClientSpecificThing>而不是ClientSpecificServiceBase<ClientSpecificThing>

有什么方法可以讓StructureMap在映射ClientSpecificServiceBase<T>時包括派生類型?

不,你不能做你想做的事。 容器不會通過注冊的組件查看泛型類型的基類。

如果您刪除第一個注冊,而僅留下,則這一點變得更加明顯

_.For<IService<ClientSpecificEntityBase>>()
    .Use<ClientSpecificServiceBase<ClientSpecificEntityBase>>();

現在,如果你打電話

var resolved = container.GetInstance<IService<ClientSpecificThing>>();

您會得到一個例外:

StructureMap.StructureMapConfigurationException:沒有注冊默認實例,並且無法自動確定類型'IService'的實例

因此,並不是將StructureMap混淆在兩個注冊之間並返回錯誤的注冊。 當您注冊時,它不識別:

IService<ClientSpecificEntityBase>

它可以使用來實現這一點,因為一個泛型類型是從另一個繼承的。

IService<ClientSpecificThing>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM