C# 组件和服务依赖之间的区别是什么?

C# 组件和服务依赖之间的区别是什么?,c#,castle-windsor,C#,Castle Windsor,我将在这个问题的前面陈述一下:我知道下面的设计很糟糕,但重构目前不是一个选项,理想情况下应该使用拦截器来完成 我正在将castle从1.6(我想)升级到3.3,不幸的是,这涉及到一些语法更改,我现在已经编译了所有内容,但是我的一些关于服务容器的测试不起作用 我有一个存储库,它有多个实现来提供不同的功能,该存储库仅用于所有不同的内联实现,下面是代码的基础: 温莎城堡注册: RepositoryRegistration<IAccountRepository, AccountRepository

我将在这个问题的前面陈述一下:我知道下面的设计很糟糕,但重构目前不是一个选项,理想情况下应该使用拦截器来完成

我正在将castle从1.6(我想)升级到3.3,不幸的是,这涉及到一些语法更改,我现在已经编译了所有内容,但是我的一些关于服务容器的测试不起作用

我有一个存储库,它有多个实现来提供不同的功能,该存储库仅用于所有不同的内联实现,下面是代码的基础:

温莎城堡注册:

RepositoryRegistration<IAccountRepository, AccountRepositoryFeedEntryDecorator>()
    .DependsOn(Dependency.OnComponent("decoratedRepository", typeof(AccountRepositoryAuthorizationDecorator))),
RepositoryRegistration<AccountRepositoryAuthorizationDecorator>()
    .DependsOn(Dependency.OnComponent("decoratedRepository", typeof(AccountRepositoryMaskingDecorator))),
RepositoryRegistration<AccountRepositoryMaskingDecorator>()
    .DependsOn(Dependency.OnComponent("decoratedRepository", typeof(AccountRepository))),
RepositoryRegistration<AccountRepository>());
实现:

public class AccountRepositoryFeedEntryDecorator : IAccountRepository
{
    private readonly IAccountRepository decoratedRepository;
    public AccountRepositoryFeedEntryDecorator(
        IAccountRepository decoratedRepository)
    {
        this.decoratedRepository = decoratedRepository;
    }

    string Create(Account account)
    {
        //Add Entry To Feed
        return decoratedRepository.Create(account);
    };

    void Update(Account account)
    {
        //Add Entry To Feed
        return decoratedRepository.Udpate(account);
    }
    Account Get(string accountId);
    {
        //Add Entry To Feed
        return decoratedRepository.Get(accountId);
    }
}

public class AccountRepositoryAuthorizationDecorator : IAccountRepository
{
    private readonly IAccountRepository decoratedRepository;
    public AccountRepositoryAuthorizationDecorator(
        IAccountRepository decoratedRepository)
    {
        this.decoratedRepository = decoratedRepository;
    }

    string Create(Account account)
    {
        //Ensure User Is Authorized
        return decoratedRepository.Create(account);
    };

    void Update(Account account)
    {
        //Ensure User Is Authorized
        return decoratedRepository.Udpate(account);
    }
    Account Get(string accountId);
    {
        //Ensure User Is Authorized
        return decoratedRepository.Get(accountId);
    }
}

public class AccountRepositoryMaskingDecorator : IAccountRepository
{
    private readonly IAccountRepository decoratedRepository;
    public AccountRepositoryMaskingDecorator(
        IAccountRepository decoratedRepository)
    {
        this.decoratedRepository = decoratedRepository;
    }

    string Create(Account account)
    {
        //Mask Sensitive Information
        return decoratedRepository.Create(account);
    };

    void Update(Account account)
    {
        //Mask Sensitive Information
        return decoratedRepository.Udpate(account);
    }
    Account Get(string accountId);
    {
        //Mask Sensitive Information
        return decoratedRepository.Get(accountId);
    }
}

public class AccountRepository : IAccountRepository
{       
    string Create(Account account)
    {
        //Create account and return details
    };

    void Update(Account account)
    {
        //Update account and return details
    }
    Account Get(string accountId);
    {
        //Return Account
    }
}
最后是我在测试中遇到的错误:

Castle.MicroKernel.Handlers.HandlerException:无法创建组件“AccountRepositoryFeedEntryDecorator”,因为它需要满足依赖项

“AccountRepositoryFeedEntryDecorator”正在等待以下依赖项: -组件“Shaw.Services.CustomerManagement.Host.Repositories.Sql.Decorators.AccountRepositoryAuthorizationDecorator”(通过重写),该组件已注册,但也在等待依赖项

“Shaw.Services.CustomerManagement.Host.Repositories.Sql.Decorators.AccountRepositoryAuthorizationDecorator”正在等待以下依赖项: -服务“AccountRepositoryFeedEntryDecorator”,已注册,但也在等待依赖项

乍一看,似乎存在某种循环依赖,但我真的看不出是如何发生的

所以问题分为两个部分,错误消息中的组件和服务依赖性规范之间有什么区别,关于哪里出了问题的任何猜测

如果重要的是升级前的原始注册:

RepositoryRegistration<IAccountRepository, AccountRepositoryFeedEntryDecorator>()
    .ServiceOverrides(new { decoratedRepository = typeof(AccountRepositoryAuthorizationDecorator).Name }),
RepositoryRegistration<AccountRepositoryAuthorizationDecorator>()
    .ServiceOverrides(new { decoratedRepository = typeof(AccountRepositoryMaskingDecorator).Name }),
RepositoryRegistration<AccountRepositoryMaskingDecorator>()
    .ServiceOverrides(new { decoratedRepository = typeof(AccountRepository).Name }),
RepositoryRegistration<AccountRepository>()
RepositoryRegistration()
.ServiceOverrides(新的{decoratedRepository=typeof(AccountRepositoryAuthorizationDecorator).Name}),
寄存登记
.ServiceOverrides(新的{decoratedRepository=typeof(AccountRepositoryMaskingDecorator).Name}),
寄存登记
.ServiceOverrides(新的{decoratedRepository=typeof(AccountRepository.Name}),
寄存登记

装饰器注册是按注册顺序进行的,您不需要指定依赖项,因此这将像您期望的那样工作:

container.Register(
    RepositoryRegistration<IAccountRepository, AccountRepositoryFeedEntryDecorator>(),
    RepositoryRegistration<IAccountRepository, AccountRepositoryAuthorizationDecorator>(),
    RepositoryRegistration<IAccountRepository, AccountRepositoryMaskingDecorator>(),
    RepositoryRegistration<IAccountRepository, AccountRepository>()
);
container.Register(
RepositoryRegistration(),
RepositoryRegistration(),
RepositoryRegistration(),
寄存登记
);
解析
IAccountRepository
的实例将生成一个
AccountRepositoryFeedEntryDecorator
,它装饰一个
AccountRepositoryAuthorizationDecorator
,等等


关于您的问题,在库中使用术语时,您很好地解释了服务、组件和依赖项之间的差异。基本上:

  • 服务是某种功能契约,通常是一个接口或委托。它是抽象的
  • 组件是服务的实现,通常是类。它是混凝土的
  • 依赖关系是组件使用的服务
在错误消息中,第一位是:

Castle.MicroKernel.Handlers.HandlerException:无法创建组件“AccountRepositoryFeedEntryDecorator”,因为它需要满足依赖项

好的,因此无法创建组件/类,因为无法满足其依赖关系。它的依赖关系是构造函数中的
IAccountRepository-decoratedRepository
参数

“AccountRepositoryFeedEntryDecorator”正在等待以下依赖项:-组件“AccountRepositoryAuthorizationDecorator”(通过覆盖),该组件已注册,但也在等待依赖项

我们仍然在讨论同一个组件/类,它说它试图使用组件/类
AccountRepositoryAuthorizationDecorator
来实现其依赖性,但该类也有依赖性

“AccountRepositoryAuthorizationDecorator”正在等待下列依赖项:-服务“AccountRepositoryFeedEntryDecorator”已注册,但也在等待依赖项

我们来到第一个类,这里有一个循环依赖关系。这是因为
RepositoryRegistration
中设置的名称与将类型传递到
Dependency.OnComponent
时计算的名称之间存在断开连接。对于前者,您使用
Type.Name
(即“AccountRepositoryFeedEntryDecorator”),对于后者,Windsor在封面下使用
Type.FullName
(即“Your.Assembly.Name,AccountRepositoryFeedEntryDecorator”)

由于命名不匹配,当Windsor尝试实现您指定的依赖项时,它将丢失该依赖项的注册,因为它具有不同的名称。因此,它在没有任何信息的情况下尽其所能(我假设)找到第一个
IAccountRepository
——这不是组件本身——它可以作为依赖项插入。这种情况再次发生在依赖项上,这是我们开始使用的第一个组件,它提供了一个循环依赖项


您可以通过删除注册的
命名的
部分,或者通过将
类型(AccountRepositoryAuthorizationDecorator).Name
传递给
依赖项.OnComponent
而不是类型本身来解决此问题。

Hi Patrick,我刚刚尝试了这个解决方案,但现在我遇到了一个错误,首先抱怨它指向了服务,然后说有其他组件匹配,然后又出现了相同的“循环”依赖性问题。我回头看,这看起来是一个完全不同的注册问题。@Phaeze啊,好的,如果是相关的,请随时更新
RepositoryRegistration<IAccountRepository, AccountRepositoryFeedEntryDecorator>()
    .ServiceOverrides(new { decoratedRepository = typeof(AccountRepositoryAuthorizationDecorator).Name }),
RepositoryRegistration<AccountRepositoryAuthorizationDecorator>()
    .ServiceOverrides(new { decoratedRepository = typeof(AccountRepositoryMaskingDecorator).Name }),
RepositoryRegistration<AccountRepositoryMaskingDecorator>()
    .ServiceOverrides(new { decoratedRepository = typeof(AccountRepository).Name }),
RepositoryRegistration<AccountRepository>()
container.Register(
    RepositoryRegistration<IAccountRepository, AccountRepositoryFeedEntryDecorator>(),
    RepositoryRegistration<IAccountRepository, AccountRepositoryAuthorizationDecorator>(),
    RepositoryRegistration<IAccountRepository, AccountRepositoryMaskingDecorator>(),
    RepositoryRegistration<IAccountRepository, AccountRepository>()
);