[英]Decorator Interception with Open Generics in StructureMap 3
[英]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.