使用Autofac将属性注入到Web Api控制器中。

问题描述 投票:1回答:3

我正试图在一个名为 "S "的产品上设置一个属性。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正确的方式来做这件事?

asp.net-web-api autofac
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

请测试一下,如果有任何问题,请告诉我。


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();

        //...
    }
}

0
投票

另一种方法是直接把你的依赖关系连接到属性上,就像这样。

var repo = new ServerPackageRepository(path: this.StoragePath);

builder.RegisterInstance(repo)
    .SingleInstance();

builder.RegisterApiControllers(Assembly.GetExecutingAssembly())
    .WithProperty("Repository", repo)
    .PropertiesAutowired();
© www.soinside.com 2019 - 2024. All rights reserved.