2015-08-10 19 views
6

oldukça aynı değil JsonConverter türetilmiş özel dönüştürücü ile bağımlılık enjeksiyon almak için bir yolu var mı: cevaptırbu kadar

How do I Inject Dependencies with Ninject, where instances are deserialised from json

size bir servis gerekmez serileştirilemeyen veri sınıfı neyse. Bağımlılığı JsonConverter'dan türetilmiş bir sınıfla kullanmanın bir yolu var mı?

[JsonConverter(typeof(MyCustomConverter))] 
public class Foo 
{ 
    public string SomeProp { get; set; } 
} 

Ve: Eğer bu olsaydı Örneğin,

public class MyCustomConverter : JsonConverter 
{ 
    private readonly IMyService myService; 

    public MyCustomConverter(IMyService _myService) 
    { 
     myService = _myService; 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     var bar = myService.SomeFunctionThatMightEffectDeserialization(); 
     //... 
    } 
} 

JSON.Net o Ninject o şey yapalım almak için MyCustomConverter başlatır nasıl içine kanca yine de var mı?

EDIT Bu, önerilen dupe gibi bir hizmeti Foo içine enjekte ETMEZ. Bu sadece MyCustomConverter içine enjekte edilir, böylece Foo'u seri hale getirebilir.

+2

@StriplingWarrior: Yinelenen tamamen aynı değil. Serileştirdiğim nesneyi * içine * eklememek istemiyorum. Serileştirdiğim nesne herhangi bir hizmete ihtiyaç duymaz, sadece json dönüştürücü bağımlılık enjeksiyonuna ihtiyaç duyar. –

+1

"MyCustomConverter" türünüze, özel durum hatalarında "IMyService" uygulamasının döndürülmesine izin veren bazı statik (iş parçacığı statik?) Olayı ekleyebilir misiniz? Garip, ama [yapılabilir] (http://stackoverflow.com/questions/1210026/return-a-value-from-an-event-is-there-a-good-practice-for-this). Ayrıca, belki burada görebilirsiniz: http://blog.ploeh.dk/2013/09/08/di-and-events-third-party-connect/ – dbc

+0

@dbc: İlginç bir fikir, bunun hakkında düşünmek zorundayım bir. –

cevap

1

Biraz kesmek ama JsonSerializerSettings'de ContractResolver'ı ayarlayarak benzer bir şey yapmak mümkündür. dönüştürücü sonra

var builder = new ContainerBuilder(); 
builder.RegisterInstance(myService); 
var container = builder.Build(); 

var settings = new JsonSerializerSettings 
{ 
    ContractResolver = new AutofacContractResolver(container), 
}; 

ve: Bu durumda, AutoFac kullanarak Yani gerçekten dönüştürücü içine hizmeti enjekte değiliz

var jsonContract = serializer.ContractResolver.ResolveContract(typeof(IMyService)); 
var service = (IMyService)jsonContract.DefaultCreator(); 

, ama en azından bir beton duymadan erişebilmek bağımlılık. Ayrıca uygulamanızla aynı Autofac kapsayıcısını kullanmıyorsunuz, ancak yeni bir tane oluşturuyorsunuz. İdeal değil, ama bu bir şey :)

İlgili konular