14

Autofac 1.4.5 を使用して WCF サービスにサービスの依存関係を挿入するのに問題があります。私は WcfIntegration のAutofac wiki ページを読んでフォローしましたが、私のデバッグでは、私の WCF サービスSystem.ServiceModel.Dispatcher.InstanceBehavior.GetInstance()AutofacWebServiceHostFactory. 私は何を間違っていますか?

ajax.svcで使用する例のファイルのようにファイルを設定しましたWebHttpBinding

<%@ ServiceHost Language="C#" Debug="true"
    Service="Generic.Frontend.Web.Ajax, Generic.Frontend.Web"
    Factory="Autofac.Integration.Wcf.AutofacWebServiceHostFactory,
             Autofac.Integration.Wcf" %>

私の WCF サービス クラスAjaxは次のように定義されています。

namespace Generic.Frontend.Web
{
    [ServiceContract]
    [AspNetCompatibilityRequirements(
        RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Ajax
    {
        public MapWebService MapWebService { get; set;}

        public Ajax() {
            // this constructor is being called
        }

        public Ajax(MapWebService mapWebService)
        {
            // this constructor should be called
            MapWebService = mapWebService;
        }

        [WebGet(ResponseFormat = WebMessageFormat.Json)]
        [OperationContract(Name = "mapchange")]
        public MapChangeResult ProcessMapChange(string args)
        {
            // use the injected service here
            var result = MapWebService.ProcessMapChange(args);
            return result;
        }
    }
}

Global.asax.cs上記のwikiに示されているように、今私は配線を使用しました:

var builder = new ContainerBuilder();
builder.RegisterModule(new AutofacModuleWebservice());
var container = builder.Build();
AutofacServiceHostFactory.Container = container;

class AutofacModuleWebservice : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.Register<Ajax>();
        builder.Register<MapWebService>().ContainerScoped();
    }
}

私のweb.configには

<services>
    <service name="Generic.Frontend.Web.Ajax">
        <endpoint address="http://mysite.com/ajax.svc/" binding="webHttpBinding"
                  contract="Generic.Frontend.Web.Ajax" />
    </service>
</services>

.

サービスは既に正常に動作していますが、Autofac ビット (読み取り: 作成/挿入) を動作させることができません。何か案は?

編集: デフォルトのコンストラクターを削除すると、残念ながら次の例外が発生します。

System.InvalidOperationException:
The service type provided could not be loaded as a service because it does not
have a default (parameter-less) constructor. To fix the problem, add a default
constructor to the type, or pass an instance of the type to the host.

乾杯、 オリバー

4

5 に答える 5

1

サービスは InstanceContextMode.Single でセットアップされていますか? その場合、wcf はデフォルトのコンストラクターを使用してサービスを作成します。これを回避するには、インスタンスのコンテキスト モードを変更し、autofac にサービスの有効期間を管理させます。

于 2010-08-16T19:35:36.543 に答える
0

デフォルトのAjaxコンストラクターを削除し、コンストラクターをこれに変更してみてください。それが実行された場合mapWebService == null、解決の問題を示します。

    public Ajax(MapWebService mapWebService = null)
    {
        // this constructor should be called
        MapWebService = mapWebService;
    }
于 2010-07-29T01:25:45.960 に答える
0

同じ System.InvalidOperationException を取得し、実装の ServiceBehavior InstanceContextMode を InstanceContextMode.PerCall から InstanceContextMode.PerSession に変更することで解決しました。おそらく、AutoFac の有効期間スコープが Web サービスの実装と同期していませんか?

AutoFac サービスの作成をテストするには、単体テストを作成して直接解決することをお勧めします。これにより、問題が強調表示され、より意味のある例外メッセージが表示されます。リクエスト ライフタイム スコープを持つサービスの場合は、テスト aspx ページを作成し、再度直接解決します。

于 2010-12-15T12:51:21.973 に答える
0

私は同じ問題を抱えていて、答えを探しているときにこの質問に出くわしました。

私の場合、プロパティ注入の使用は機能し、問題のコードには使用できるプロパティが既にあります。

namespace Generic.Frontend.Web
{
    [ServiceContract]
    [AspNetCompatibilityRequirements(
        RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Ajax
    {
        // inject the dependency here
        public MapWebService MapWebService { get; set;}

        [WebGet(ResponseFormat = WebMessageFormat.Json)]
        [OperationContract(Name = "mapchange")]
        public MapChangeResult ProcessMapChange(string args)
        {
            // use the injected service here
            var result = MapWebService.ProcessMapChange(args);
            return result;
        }
    }
}

プロパティ注入を使用するように登録します (wiki のサンプル コードと構文は、現在バージョン 2.5.2.830 を使用しているため変更されています)。

builder.RegisterType<Ajax>().PropertiesAutowired();
于 2011-09-21T20:32:26.400 に答える