使用Castle Windsor WCF工具和WCF 4 REST服务会出现“找不到组件”错误

时间:2012-07-18 16:40:28

标签: wcf rest castle-windsor castle

作为StackOverflow的长期读者,但没有找到我的问题的解决方案,这是我第一次尝试提问,所以不要对我太苛刻: - )

我有以下WCF 4 REST服务定义:

服务合同

namespace RestService2.Service
{
    [ServiceContract]
    public interface ISampleService
    {
       [WebGet(UriTemplate = "")]
       List<SampleItem> GetCollection();

       [WebInvoke(UriTemplate = "", Method = "POST")]
       SampleItem Create(SampleItem instance);

       [WebGet(UriTemplate = "?id={id}")]
       SampleItem Get(int id);

       [WebInvoke(UriTemplate = "?id={id}", Method = "PUT")]
       SampleItem Update(int id, SampleItem instance);

       [WebInvoke(UriTemplate = "?id={id}", Method = "DELETE")]
       void Delete(int id);
    }
}

服务实施

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class SampleService : ISampleService
{
    private IDatabase db;
    public SampleService(IDatabase db)
    {
        this.db = db;
    }

    public SampleService()
    {
    }
    public List<SampleItem> GetCollection()
    {
        return db.Items.Values.ToList();
    }

    public SampleItem Create(SampleItem instance)
    {
        // Add the new instance of SampleItem to the collection
        db.Items.Add(instance.Id, instance);
        return db.Items[instance.Id];
    }

    //..Rest omitted..
}

数据库界面:

using RestService2.Entities;

namespace RestService2.Service
{
   public interface IDatabase
   {
      Dictionary<int, SampleItem> Items { get; }

   }
}

数据库实施:

public class Database : IDatabase
{
    private Dictionary<int, SampleItem> items;

    public Database()
    {
    }

    public Dictionary<int, SampleItem> Items
    {
        get
        {
            return items;
        }
    }
}

..和global.asax文件

namespace RestService2.Web
{
    public class Global : HttpApplication
    {
        static IWindsorContainer Container {get; set;}

        void Application_Start(object sender, EventArgs e)
        {
           BuildContainer();
           RegisterRoutes();
        }

        private void BuildContainer()
        {
           Container = new WindsorContainer();
           Container.AddFacility<WcfFacility>()
            .Register(Component.For<ISampleService>().ImplementedBy<SampleService>().Named("SampleService"))
            .Register(Component.For<IDatabase>().ImplementedBy<Database>());

        }
        private void RegisterRoutes()
        {
            RouteTable.Routes.Add(new ServiceRoute("SampleService",
            new DefaultServiceHostFactory(), typeof(SampleService)));
        }
    }
}

服务契约,服务实现,数据库接口和数据库实现在程序集A中,SampleItem(实体)在程序集B中定义,global.asax.cs在程序集C中。

我已将程序集A和B中的引用添加到程序集C.

当我尝试访问服务帮助页面(或任何服务方法)时,我收到以下错误消息:Could not find a component with type RestService2.Service.SampleService, RestService2.Service, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null, did you forget to register it?

知道可能有什么问题吗?我该如何正确配置容器?

此致

2 个答案:

答案 0 :(得分:2)

我能够使用WCFIntegration工具构建REST服务,使用两个接口进行注册和通过MVC路由机制。

// SVC Routes
routes.Add(new ServiceRoute("Example", new WindsorServiceHostFactory<RestServiceModel>(), typeof(IExample)));

请记住在调用RegisterRoutes之前在Windsor中注册服务/实现(此代码将在此处)。此外,请确保在默认路由之前调用此路由注册,否则将使用该路由。

然后可以通过路线调用该服务,即:

http://localhost:80/Core/Example/GetAll/

答案 1 :(得分:1)

因为您按具体类型

注册了路由
RouteTable.Routes.Add(new ServiceRoute("SampleService", 
            new DefaultServiceHostFactory(), typeof(SampleService))); 

据我记得你不能这样做......我的意思是你不能通过界面注册,你需要通过具体注册到容器中

而不是

 .Register(Component.For<ISampleService>().ImplementedBy<SampleService>().Named("SampleService")) 

 .Register(Component.For<SampleService>().Named("SampleService"))