2012-09-13 203 views
1

我有以下代碼:StructureMap - 註冊泛型類型

public class Dispatcher : IDispatcher { 
    public void Send(Order order) { 
    var type = typeof(IOrderHandler<>).MakeGenericType(order.GetType()); 
    var handler = ObjectFactory.GetInstance(type); 
    } 
} 

注:我試圖讓IOrderHandler其中爲了在這種情況下是: 公共類CoffeOrder:訂單{}

我的StructureMap配置如下:

ObjectFactory.Initialize(x => { 
    x.For<IOrderHandler>().Use<OrderHandler>(); 
}); 

當我調試它時,我得到以下錯誤或: {「StructureMap配置失敗:\ r \ n錯誤:104 \ r \ n資源:註冊表:StructureMap.Configuration.DSL.Registry,StructureMap,版本= 2.6.4.0,...

我嘗試了其他選項,我總是以104錯誤或202錯誤結束: 「StructureMap異常代碼:202 \ n沒有默認實例爲PluginFamily Proj.Test.Tests + IOrderHandler`1 [[Proj.Test.Tests + CoffeOrder,Proj.Test, ...

注意:CoffeOrder是我在測試中傳遞的訂單的類型。

我爲Handler類和接口的代碼如下:

public class CoffeHandler : OrderHandler<CoffeOrder> { 
    public override void Handle(CoffeOrder order) { 
    // Some Code 
    } // CoffeHandler 
} 

public interface IOrderHandler { 
    void Handle(Order order); 
} // IOrderHandler 

public interface IOrderHandler<TOrder> : IOrderHandler where TOrder : Order { 
    void Handle(TOrder order); 
} // IOrderHandler 

public abstract class OrderHandler : IOrderHandler { 
    public abstract void Handle(Order order); 
} // OrderHandler 

public abstract class OrderHandler<TOrder> : OrderHandler, IOrderHandler<TOrder> where TOrder : Order { 

    public override void Handle(Order order) { 
    TOrder torder = (TOrder)order; 
    Handle(torder); 
    } // Handle 

    public abstract void Handle(TOrder order); 

} // OrderHandler 

可能有人,請幫幫我嗎?

謝謝你, 米格爾

回答

3

注意,你沒有馬上在登記而不是在分辨率。您的註冊說:「當請求類IOrderHandler類型的,返回的OrderHandler

具體實例你OrderHandler是一個抽象類,所以StructureMap不能創建它的一個具體實例。如果你註冊成爲下面,

ObjectFactory.Initialize(
      x => x.For<IOrderHandler<CoffeOrder>>().Use<CoffeHandler>()); 

您的意思是,「當請求類型爲IOrderHandler<CoffeOrder>的類(這是您在示例中請求的內容)時,返回一個具體實例CoffeHandler。這是一個有效的映射,因爲它可以實例化一個CoffeHandler

雖然上面提到了你的問題,但我有一個預感,如果你想註冊很多不同的實現,你可能希望StructureMap爲你做更多的工作。如果是這樣的話,你很幸運,因爲StructureMap支持Open Generics。

那你的代碼會像:

var handler = ObjectFactory.ForGenericType(typeof(IOrderHandler<>)) 
      .WithParameters(order.GetType()) 
      .GetInstanceAs<IOrderHandler>(); 

如果你有一個具體的通用實現的IOrderHandler<>你可以只註冊一個。但是既然你沒有和[按照我的預感]你不想註冊每一個具體的實例,你需要做一個掃描。如何做到這一點是一個不同的問題,我不知道你想掃描什麼,我不能回答。但是,您可以看到here的博客文章,其中詳細介紹了結構圖開放式泛型,其中包括涵蓋掃描的樣本。

相關問題