我正在努力尝试在应用程序中简化我们的一些架构。
我有3个项目
Api与服务项目交谈,服务与存储库对话。
在我的服务项目中,我需要能够使用其他服务。这将允许我减少重复代码的数量
我的代码示例就像这样
public class ApplicationService:IApplicationService
{
private readonly ILog _log;
public IUserService UserService { get; set; }
public ApplicationService(ILog log)
{
_log = log;
if (_log == null)
{
throw new ArgumentNullException("log");
}
if (UserService == null)
{
throw new ArgumentNullException("UserService");
}
}
}
public class UserService:IUserService
{
private readonly IUserRepository _userRepository;
public ICustomerService CustomerService { get; set; }
public UserService(IUserRepository userRepository)
{
_userRepository = userRepository;
}
autofac配置的My Startup.cs看起来像
builder.RegisterType<Services.UserService>().As<IUserService>().InstancePerLifetimeScope().PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);
builder.RegisterType<Services.ApplicationService>().As<IApplicationService>().InstancePerLifetimeScope().PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);
builder.RegisterType<Services.CustomerService>().As<ICustomerService>().InstancePerLifetimeScope().PropertiesAutowired(PropertyWiringOptions.AllowCircularDependencies);
builder.RegisterAssemblyTypes(Assembly.Load("MyApp.Services"))
.Where(t => t.Name.EndsWith("Service"))
.AsImplementedInterfaces();
我确实找到了这个较旧的SO帖子'Autofac Circular Component Dependency Detected' Error,它与我遇到的问题看起来非常相似。
阅读autofac文档我无法看到我做错了Circular Dependencies
当应用程序当前运行并且调用applicationService中的构造函数时。 UserService属性始终为null。为什么会这样?
答案 0 :(得分:1)
在ApplicationService构造函数执行中,UserService将始终为null,因为您没有在构造函数中为其分配任何内容(您没有使用构造函数注入)。所以这段代码总是抛出异常:
if (UserService == null)
{
throw new ArgumentNullException("UserService");
}
删除此代码,您应该没问题。在使用构造函数创建对象之后,DI容器中的属性注入会为对象属性分配依赖项(没有其他方法)。
BTW我在你所包含的代码中看不到任何循环依赖。您还没有包含ICustomerService和IUserRepository实现的代码,所以可能存在某些内容。