2015-05-02 21 views
24

SinyalR'yi yapılandırmak için bir yol olup olmadığını bilmek istiyorum, böylece istemcideki hub işlevler deve kasasını kullanarak nesneleri döndürür.SinyalR: deve kasasını kullan

Teşekkürler. Eğer özel bir IoC kullanırsanız

cevap

44

Rulo

public class SignalRContractResolver : IContractResolver 
{ 

    private readonly Assembly assembly; 
    private readonly IContractResolver camelCaseContractResolver; 
    private readonly IContractResolver defaultContractSerializer; 

    public SignalRContractResolver() 
    { 
     defaultContractSerializer = new DefaultContractResolver(); 
     camelCaseContractResolver = new CamelCasePropertyNamesContractResolver(); 
     assembly = typeof(Connection).Assembly; 
    } 

    public JsonContract ResolveContract(Type type) 
    { 
     if (type.Assembly.Equals(assembly)) 
     { 
      return defaultContractSerializer.ResolveContract(type); 

     } 

     return camelCaseContractResolver.ResolveContract(type); 
    } 

} 

gibi kendi Conttract çözümleyici JsonSerializer somut tipi ve örneğin gibi bazı IOCs çünkü sorunlarla çalıştırabilirsiniz

var settings = new JsonSerializerSettings(); 
settings.ContractResolver = new SignalRContractResolver(); 
var serializer = JsonSerializer.Create(settings); 
GlobalHost.DependencyResolver.Register(typeof (JsonSerializer),() => serializer); 

gibi ol Ninject, bağlanmamış beton türlerini enjekte edecektir. Ninjects durumda çözüm Ninject ile yerine SignalRs DependencyResolver

var settings = new JsonSerializerSettings(); 
settings.ContractResolver = new SignalRContractResolver(); 
var serializer = JsonSerializer.Create(settings); 
kernel.Bind<JsonSerializer>().ToConstant(serializer); 
sahibi ile arasında kaydetmek için blogumda

diğer bilgiler: http://andersmalmgren.com/2014/02/27/why-overriding-jsonserializer-no-longer-work-in-signalr-2-0/

+0

Bir çekicilik gibi çalışıyor. – dafriskymonkey

+1

Aynı yapılandırmayı ASP.NET 5/SignalR 3'te nasıl yapacağınızı biliyor musunuz? GlobalHost şimdi yeni bağımlılık enjeksiyonu stili ile değiştirildi ... – Mikhail

+0

Üzgünüz, henüz SignalR 3'e bakmış, – Anders

4

Anders yanıt doğrudur; ASP .NET Çekirdek ile kullanım için

var settings = new JsonSerializerSettings(); 
settings.ContractResolver = new SignalRContractResolver(); 
var serializer = JsonSerializer.Create(settings); 
builder.RegisterInstance(serializer).As<JsonSerializer>(); 
1

, başlangıç ​​böyle JsonSerializer kayıt olabilirsiniz -> ConfigureServices: Sadece size startup.cs bu kaydı kullanmalısınız yerine Ninject ait AutoFac kullanan herkes için eklemek istedim:

var settings = new JsonSerializerSettings { ContractResolver = new SignalRContractResolver() }; 
var serializer = JsonSerializer.Create(settings); 
services.AddSingleton(serializer); 
0

Eğer SignalR yapılandırma ile karışmaması istiyorum ya da çok fazla sorunlarını, sen JsonProperty modelinize serileştirme sonra özellik adını belirtmek için özellik ekleyebilir bulundu yoksa. JsonProperty, SignalR'ın serileştirme için kullandığı JSON.NET'ten.

[JsonProperty("id")] 
    public byte Id { get; set; } 

    [JsonProperty("name")] 
    public string Name { get; set; } 
+0

bu daha fazla güçlük, her defasında bu sabit kod dizelerini değiştirmek zorunda kalacaksınız. – dafriskymonkey