为构造函数/属性服务层

时间:2016-10-03 20:00:41

标签: c# dependency-injection autofac

我正在努力尝试在应用程序中简化我们的一些架构。

我有3个项目

  • API
  • 服务
  • 存储库

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。为什么会这样?

1 个答案:

答案 0 :(得分:1)

在ApplicationService构造函数执行中,UserService将始终为null,因为您没有在构造函数中为其分配任何内容(您没有使用构造函数注入)。所以这段代码总是抛出异常:

if (UserService == null)
{
     throw new ArgumentNullException("UserService");
}

删除此代码,您应该没问题。在使用构造函数创建对象之后,DI容器中的属性注入会为对象属性分配依赖项(没有其他方法)。

BTW我在你所包含的代码中看不到任何循环依赖。您还没有包含ICustomerService和IUserRepository实现的代码,所以可能存在某些内容。