1

StackOverflowの長年の読者ですが、ここで私の問題の解決策が見つからないのは、質問をする最初の試みですので、あまり厳しくしないでください:-)

次のWCF4RESTサービス定義があります。

サービス契約

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?

何が問題になる可能性があるか考えていますか?コンテナを正しく構成するにはどうすればよいですか?

よろしく

4

2 に答える 2

2

WCFIntegration機能を使用して、登録用のインターフェイスとMVCルーティングメカニズムの両方を使用して、RESTサービスを構築することができました。

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

呼び出す前に、Windsorにサービス/実装を登録することを忘れないでくださいRegisterRoutes(このコードがある場所)。さらに、デフォルトルートの前にこのルート登録を呼び出すようにしてください。そうしないと、代わりにそれが使用されます。

その後、サービスはルートを介して呼び出すことができます。

http://localhost:80/Core/Example/GetAll/
于 2012-11-22T08:49:41.527 に答える
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")) 
于 2012-07-19T07:29:46.317 に答える