作为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?
知道可能有什么问题吗?我该如何正确配置容器?
此致
答案 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"))