1

您如何将 Windsor-Castle WCFFacility 与 WCF 4.0 REST 服务一起使用?

当您不再拥有 .svc 文件时,您如何建立到工厂的链接?

TIA

索伦

4

1 回答 1

1

使用 Windsor 3.0 这非常简单(如果我正确理解了您的问题,如果我遗漏了什么,我深表歉意)。

向您展示的最简单的事情是创建一个控制台应用程序并确保您正在引用:

  • 城堡核心
  • 温莎城堡
  • Castle.Facility.WcfIntegration
  • 系统.服务模型
  • System.ServiceModel.Web
  • System.Runtime.Serialization

现在像这样定义一个 RESTful 服务:

[DataContract]
public class Frob
{
    [DataMember]
    public string Name { get; set; }

    [DataMember]
    public string Fribble { get; set; }
}   

[ServiceContract]
public interface IFrobService
{
    [OperationContract]
    [WebGet(UriTemplate = "/")]
    IEnumerable<Frob> GetAllFrobs();

    [OperationContract]
    [WebGet(UriTemplate = "/{name}")]
    Frob GetFrobByName(string name);
}

public class FrobService : IFrobService
{
    private readonly List<Frob> _frobs
        = new List<Frob>
              {
                  new Frob {Name = "Foob", Fribble = "Soop"},
                  new Frob {Name = "Hoob", Fribble = "Soop"},
                  new Frob {Name = "Doob", Fribble = "Noop"}
              };

    public IEnumerable<Frob> GetAllFrobs()
    {
        return _frobs;
    }

    public Frob GetFrobByName(string name)
    {
        return _frobs
            .FirstOrDefault(f =>
                            f.Name.Equals(name,
                                          StringComparison.OrdinalIgnoreCase));
    }
}

现在您可以像这样将该服务连接到 Windsor 容器中(因为它是一个控制台应用程序,我将只向您展示主要方法):

public static class Program
{
    static void Main()
    {            
        var container = new WindsorContainer();

        container
            .AddFacility<WcfFacility>(f => f.CloseTimeout = TimeSpan.Zero)
            .Register(Component.For<IFrobService>()
                          .ImplementedBy<FrobService>()
                          .AsWcfService(new RestServiceModel("http://localhost/frobs")));

        Console.ReadKey();
    }
}

这是由 Castle Windsor 托管的 WCF REST 服务。

将浏览器指向:“http://localhost/frobs”会得到所有的 frobs,如果将浏览器指向“http://localhost/frobs/Doob”会得到一个叫做 Doob 的 frob,你会得到主意...

于 2012-03-08T15:58:54.677 回答