1

System.Web.Http.ApiControllerのプロパティを解決済みの値に設定しようとしていますIServerPackageRepository。コントローラは で実行されHttpSelfHostServerDependencyResolverは に設定されていAutofacWebApiDependencyResolverます。Autofac.Module.Loadメソッドのコードは次のとおりです

...

builder.RegisterType<ServerPackageRepository>()
    .As<IServerPackageRepository>()
    .SingleInstance()
    .WithParameter("path", this.StoragePath);

builder.RegisterApiControllers(Assembly.GetExecutingAssembly())
    .PropertiesAutowired();

ApiControllerコントローラー自体にはタイプのプロパティがあります

public IServerPackageRepository Repository { get; set; }

しかし、決して解決されません。

ApiControllerデフォルトのコンストラクターしか使用しないため、このようにしようとしています。Autofacを使用してこれを正しい方法で行う方法に関する提案はありますか?

4

3 に答える 3

4

デフォルトのコンストラクターのみを使用している場合ApiController、依存関係リゾルバーが呼び出されていないように聞こえ、Web API に正しく登録されていない可能性があります。これは、コンストラクター注入によるセルフホスティングの実例です。

依存関係 (この場合は単純なロガー):

public interface ILogger
{
    void Log(string text);
}

public class Logger : ILogger
{
    public void Log(string text)
    {
        Debug.WriteLine(text);
    }
}

ロガーに依存する単純なコントローラー:

public class ValuesController : ApiController
{
    readonly ILogger _logger;

    public ValuesController(ILogger logger)
    {
        _logger = logger;
    }

    // GET api/values
    public IEnumerable<string> Get()
    {
        _logger.Log("GET api/values");

        return new string[] { "value1", "value2" };
    }
}

コンソール アプリケーション:

class Program
{
    static void Main(string[] args)
    {
        var configuration = new HttpSelfHostConfiguration("http://localhost:8080");

        configuration.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
            );

        var builder = new ContainerBuilder();

        // Register API controllers using assembly scanning.
        builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

        // Register API controller dependencies.
        builder.Register<ILogger>(c => new Logger()).SingleInstance();

        var container = builder.Build();

        // Set the dependency resolver implementation.
        var resolver = new AutofacWebApiDependencyResolver(container);
        configuration.DependencyResolver = resolver;

        // Open the HTTP server and listen for requests.
        using (var server = new HttpSelfHostServer(configuration))
        {
            server.OpenAsync().Wait();

            Console.WriteLine("Hosting at http://localhost:8080/{controller}");
            Console.ReadLine();
        }
    }
}

以下を使用してコントローラー アクションをヒットします。

http://localhost:8080/api/values

これをテストして、問題があればお知らせください。

于 2012-12-21T14:47:42.840 に答える
2

これがあなたが望むものかどうかはわかりませんが、独自のベースコントローラーを作成してそれに注入することができますIServerPackageRepository

public class MyApiController : ApiController { 

    public IServerPackageRepository ServerPackageRepository { get; set; }

    public MyApiController(IServerPackageRepository serverPackageRepository) { 

        ServerPackageRepository = serverPackageRepository;
    }
}

次に、これをベース コントローラーとして使用します。

public class ProductsController : MyApiController { 

    public ProductsController(IServerPackageRepository serverPackageRepository) 
        : base(serverPackageRepository) { 
    }

    public IEnumerable<Product> Get() { 

        ServerPackageRepository.DoWork();

        //...
    }
}
于 2012-12-21T13:37:46.027 に答える