1

私はautofacを初めて使用するので、ばかげた質問をしていたら申し訳ありません。

次のインターフェイスとクラスを持っているコンストラクターに引数を渡すのに問題があります。

interface IMyService
{
    string GetVersion();
}

class MyService : webService, IMyService
{
    public MyService(string serverPath)
        : base(serverPath){}

    public string GetVersion() { return "1.0"; }
}

これは私が物事を設定する方法です:

public static class AutofacManager
{
    public static IContainer Container { get; set; }

    public static void Configure()
    {
        var builder = new ContainerBuilder();
        builder.RegisterType<string>();
        builder.Register<MyService>((c, p) => new MyService(c.Resolve<string>(p))).As<IMyService>();
        Container = builder.Build();
    }
}

そして、私はこのようなオブジェクトを使用しています:

var ws = Container.Resolve<IMyService>(Autofac.TypedParameter.From<string>(url));
var ver = ws.GetVersion();

問題は、空の文字列がコンストラクターに渡されることです。URL変数を渡すと思っていました。

ヘルプ?ありがとう

4

1 に答える 1

1

最初に、必要のない文字列型を登録しようとします (その行を削除できます。

次のようにデリゲートを変更できます。

builder.Register((c, p) =>
{
    var url = p.Named<string>("url");
    return new MyService(url);
}).As<IMyService>();

名前付きパラメーターを追加して、解決時に url を指定できるようにします。

As は確実にインターフェイスとして登録します (それ以外の場合は具象クラスを登録します)。

次に、オブジェクトを解決します。

string MyUrl = "";
var ws = Container.Resolve<IMyService>(new NamedParameter("url", MyUrl));

編集: 毎回 URL を解決する代わりに、登録時に URL を設定することもできます。

string MyUrl = "hello";
builder.RegisterType<MyService>().
WithParameter(new NamedParameter("serverPath",MyUrl)).As<IMyService>(); 

次に、次のように解決できます。

var ws = Container.Resolve<IMyService>();
于 2013-11-13T10:11:21.270 に答える