簡體   English   中英

將自定義TypeConverter限制為特定程序集

[英]Restrict custom TypeConverter to a specific assembly

我定義了一個自定義TypeConverter以及關聯的自定義TypeDescriptionProviderTypeDescriptor以便從REST Web服務返回值(使用ASP.NET Core)時,我的類型自動轉換為字符串。

但是,我現在注意到,在應用程序的其他位置(例如,當我序列化XML以保存配置文件或在WPF中加載XAML時),正在調用我的自定義TypeConverter

有沒有一種方法可以限制我的自定義類型轉換器/描述提供程序/描述符,以便僅在我的Web服務程序集中使用它們?


更多信息

我的內部對象沒有使用[TypeConverter()]屬性來指定要使用的類型轉換器。

作為答案,我正在使用AutoMapper進行從內部對象到數據傳輸對象的映射。 是AutoMapper,它利用TypeDescriptor / TypeConverter將對象的屬性自動映射到字符串。 我希望該行為是只有 AutoMapper 才能使用此自定義類型轉換器。

但是,類型轉換器似乎已在全局注冊: TypeDescriptor.AddProvider(customerProvider, myType)

我看不到將其限制為僅某些組件的方法。 到目前為止,我唯一的想法是以某種方式使用ICustomTypeDescriptorGetComponentName() (但始終看起來為null )或在單獨的AppDomain運行我的Web服務器,我假定使用單獨的類型轉換器,但可能會給編組帶來很大的問題/序列化。 還有其他解決方案嗎?

一旦在模型上對屬性進行了硬編碼,則將很難在運行時進行更改/修改/禁用,也無法刪除。 在您的情況下,即使在Web應用程序中,也不能禁用或刪除這些屬性。

我給了您一個選擇, AutoMapper ,多年來我一直在使用它來轉換作業,尤其是對於MVXX模式,無論是ASP.NET MVC還是WPF MVVM,它們都需要將view models轉換為real models AutoMapper通過配置而不是屬性應用轉換器,這使您的請求成為可能。

https://github.com/AutoMapper/AutoMapper/blob/master/docs/Custom-type-converters.md

Mapper.Initialize(cfg => {
  cfg.CreateMap<ModelA, string>().ConvertUsing(new ModelAToStringTypeConverter());
  cfg.CreateMap<ModelA, ModelB>().ConvertUsing(new ModelAToBTypeConverter());
  cfg.CreateMap<ModelB, ModelA>().ConvertUsing(new ModelBToATypeConverter());
  ....
  cfg.AddProfile<WpfProfile>();
});

public class WpfProfile: Profile
{
    public OrganizationProfile()
    {
        CreateMap<Foo, FooDto>();
        // Use CreateMap... Etc.. here (Profile methods are the same as configuration methods)
    }
}

如果ModelA的屬性是ModelB的子集,則您甚至不必對轉換器進行硬編碼, cfg.CreateMap<ModelB, ModelA>()會自動完成操作。

AutoMapper提到了這一點

.NET Framework還通過TypeConverter類支持類型轉換器的概念。 AutoMapper在配置檢查和映射中支持這些類型的類型轉換器,而無需任何手動配置。 AutoMapper使用TypeDescriptor.GetConverter方法來確定是否可以映射源/目標類型對。

暫無
暫無

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

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