我正试图在一个名为 "S "的产品上设置一个属性。System.Web.Http.ApiController
的值,到一个已解决的 IServerPackageRepository
. 该控制器运行在 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正确的方式来做这件事?
如果该 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
请测试一下,如果有任何问题,请告诉我。
不知道这是否是你想要的,但你可以创建你自己的基础控制器,并注入以下内容 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();
//...
}
}
另一种方法是直接把你的依赖关系连接到属性上,就像这样。
var repo = new ServerPackageRepository(path: this.StoragePath);
builder.RegisterInstance(repo)
.SingleInstance();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly())
.WithProperty("Repository", repo)
.PropertiesAutowired();