Autofac 不会自动将属性连接到自定义 class
Autofac not auto wiring properties to a custom class
我正在尝试使用 Autofac 自动装配属性为控制器调用的自定义 class 设置一个 class。我有一个测试项目来展示这个。我的解决方案中有两个项目。一个 MVC 网络应用程序和一个 class 服务库。这是代码:
在服务项目中,AccountService.cs:
public interface IAccountService
{
string DoAThing();
}
public class AccountService : IAccountService
{
public string DoAThing()
{
return "hello";
}
}
现在剩下的都在 MVC web 项目中了。
Global.asax.cs
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
builder.RegisterAssemblyTypes(typeof(AccountService).Assembly)
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces().InstancePerRequest();
builder.RegisterType<Test>().PropertiesAutowired();
builder.RegisterFilterProvider();
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
Test.cs:
public class Test
{
//this is null when the var x = "" breakpoint is hit.
public IAccountService _accountService { get; set; }
public Test()
{
}
public void DoSomething()
{
var x = "";
}
}
HomeController.cs
public class HomeController : Controller
{
//this works fine
public IAccountService _accountServiceTest { get; set; }
//this also works fine
public IAccountService _accountService { get; set; }
public HomeController(IAccountService accountService)
{
_accountService = accountService;
}
public ActionResult Index()
{
var t = new Test();
t.DoSomething();
return View();
}
//...
}
从上面的代码可以看出,_accountServiceTest
和_accountService
在controller中都可以正常工作,但是在Test.cs
的DoSomething()
方法中设置断点时=], _accountService
始终为 null,无论我在 global.asax.cs
.
中输入什么
当您使用 new
创建对象时,autofac 对这个对象一无所知。所以你总是在 Test
class.
中得到 IAccountService
的 null 是正常的
正确的做法是:
设置测试接口 class 并注册它。然后将此接口添加到您的 HomeController 构造函数中。
public HomeController(IAccountService accountService,ITest testService)
我正在尝试使用 Autofac 自动装配属性为控制器调用的自定义 class 设置一个 class。我有一个测试项目来展示这个。我的解决方案中有两个项目。一个 MVC 网络应用程序和一个 class 服务库。这是代码:
在服务项目中,AccountService.cs:
public interface IAccountService
{
string DoAThing();
}
public class AccountService : IAccountService
{
public string DoAThing()
{
return "hello";
}
}
现在剩下的都在 MVC web 项目中了。
Global.asax.cs
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
builder.RegisterAssemblyTypes(typeof(AccountService).Assembly)
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces().InstancePerRequest();
builder.RegisterType<Test>().PropertiesAutowired();
builder.RegisterFilterProvider();
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
Test.cs:
public class Test
{
//this is null when the var x = "" breakpoint is hit.
public IAccountService _accountService { get; set; }
public Test()
{
}
public void DoSomething()
{
var x = "";
}
}
HomeController.cs
public class HomeController : Controller
{
//this works fine
public IAccountService _accountServiceTest { get; set; }
//this also works fine
public IAccountService _accountService { get; set; }
public HomeController(IAccountService accountService)
{
_accountService = accountService;
}
public ActionResult Index()
{
var t = new Test();
t.DoSomething();
return View();
}
//...
}
从上面的代码可以看出,_accountServiceTest
和_accountService
在controller中都可以正常工作,但是在Test.cs
的DoSomething()
方法中设置断点时=], _accountService
始终为 null,无论我在 global.asax.cs
.
当您使用 new
创建对象时,autofac 对这个对象一无所知。所以你总是在 Test
class.
IAccountService
的 null 是正常的
正确的做法是: 设置测试接口 class 并注册它。然后将此接口添加到您的 HomeController 构造函数中。
public HomeController(IAccountService accountService,ITest testService)