2016-05-09 5 views
0

Здесь у меня есть простое приложение WinForm, в котором все службы NancyFx работают нормально: я использую объект Person, который реализует интерфейс IPerson. У nancyModule есть ctor с параметром IPerson и в почтовом маршруте nancyModule я использую this.Bind(); Если я хочу отобразить человека в форме, как мне это сделать?Nancy fx как использовать в Windows Forms

using System; 
using System.Windows.Forms; 
using Microsoft.Owin.Hosting; 
using Nancy; 
using Nancy.ModelBinding; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     private IDisposable dispose; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      string uri = "http://localhost:8080/"; 
      dispose = WebApp.Start<Startup1>(uri); 
     } 
    } 

    public interface IPerson 
    { 
     String Name { get; set; } 
    } 
    public class Person : IPerson 
    { 
     public String Name { get; set; } 
    } 
    public class nancyModule : NancyModule 
    { 
     public nancyModule(IPerson person) 
     { 
      Post["/data"] = _ => 
      { 
       person = this.Bind<Person>(); 
       //HOW DO I DISPLAY THE person ON THE FORM UI 
       return HttpStatusCode.OK; 
      }; 
     } 
    } 
} 

ответ

1

Если вы хотите отобразить данные человека в форме, вам необходимо позвонить в REST API из приложения Win Forms. Возьмите ответ и выведите результаты. Проще говоря, так вы можете достичь этого.

Я не использовал async и await ключевые слова, которые в идеале вы бы, но для краткости я опущенные это.

Во-первых, я снял зависимость IPerson от модуля, поскольку это не зависимость, как таковой, а выход из вашего POST. С этой незначительной настройкой это выглядит так:

Если вы все еще сильно чувствуете себя зависимым, тогда просто оставьте его, и код будет работать, как ожидалось.

public class PersonModule : NancyModule 
{ 
    public PersonModule() 
    { 
     this.Post["/data"] = args => this.AddPerson(); 
    } 

    private Negotiator AddPerson() 
    { 
     var person = this.Bind<Person>(); 

     return this.Negotiate 
      .WithStatusCode(HttpStatusCode.Created) 
      .WithContentType("application/json") 
      .WithModel(person); 
    } 
} 

Теперь с вашего Win Forms приложение просто вызовите API через HttpClient, как это:

using (var client = new HttpClient()) 
{ 
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
    var person = new Person { Name = "Foo Bar" }; 
    var serializer = new JavaScriptSerializer(); 
    var response = client.PostAsync(
     "http://localhost:8080/data", 
     new StringContent(serializer.Serialize(person), Encoding.UTF8, "application/json")).Result; 
    var result = new JavaScriptSerializer().Deserialize<Person>(response.Content.ReadAsStringAsync().Result); 

    TextBox1.Text = result.Forename; 
} 

из чистейших там упомянут 3-библиотеки, такие как Json.NET и Service Stack, который позволяет для упрощения serialization и deserialization, но для простоты в этом примере я использую out of the box features.

+0

Да, это похоже на путь вперед. Мои мысли были запутаны в этом вопросе. Я предполагаю, что суть того, что я пытаюсь понять, - это я могу ввести Нэнси в зависимость от формы, но не существует способа сделать это. Благодарю помощника. –

+0

Не беспокойтесь. Рад был помочь. –