1

我正在尝试将 anSystem.Web.Http.ApiController上的属性设置为 resolved 的值IServerPackageRepository。控制器在 a 中运行,HttpSelfHostServer并且DependencyResolver已设置为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 回答
0

另一种方法是将您的依赖项直接连接到属性,如下所示:

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

builder.RegisterInstance(repo)
    .SingleInstance();

builder.RegisterApiControllers(Assembly.GetExecutingAssembly())
    .WithProperty("Repository", repo)
    .PropertiesAutowired();
于 2020-06-02T09:37:04.690 回答