因为ABusiness 是一个做的服务,它通常会设置如下:
public interface IABusiness
{
void functionInABusiness();
}
public class ABusiness : IABusiness
{
// making the variable private readonly ensures that nothing
// can set it after the constructor does (thus it can never be null)
private readonly IADataAccess aDataAccess;
public ABusiness(IADataAccess aDataAccessParam)
{
// Guard clause ensures you cannot set this.aDataAccess to null
if (aDataAccessParam == null)
throw new ArgumentNullException(nameof(aDataAccessParam));
this.aDataAccess=aDataAccessParam;
}
public void functionInABusiness()
{
// Do something with aDataAccess
}
}
然后您将添加IABusiness 作为BBusiness 的依赖项。
public interface IBBusiness
{
void function();
}
public class BBusiness : IBBusiness
{
private readonly IBDataAccess bDataAccess;
private readonly IABusiness aBusiness;
public BBusiness(IBDataAccess bDataAccessParam, IABusiness aBusinessParam)
{
if (bDataAccessParam == null)
throw new ArgumentNullException(nameof(bDataAccessParam));
if (aBusinessParam == null)
throw new ArgumentNullException(nameof(aBusinessParam));
this.bDataAccess=bDataAccessParam;
this.aBusiness=aBusinessParam;
}
public function()
{
this.aBusiness.functionInABusiness();
// Do something else...
}
}
在您的 composition root 中,您将设置 Unity 以将 IABusiness 与 ABusiness 和 IBBusiness 与 BBusiness 关联。请注意,如果类和接口以某种方式命名或放在某个位置等,某些项目会使用自动执行此步骤的约定。
container.RegisterType<IABusiness, ABusiness>();
container.RegisterType<IBBusiness, BBusiness>();
container.RegisterType<IADataAccess, ADataAccess>();
container.RegisterType<IBDataAccess, BDataAccess>();
整个想法是您不要直接从BBusiness 类引用ABusiness 类,因此您可以将IABusiness 的不同实例注入BBusiness(用于测试,或创建装饰器类IABusiness 周围增加了额外的责任,等等)
此外,IABusiness 接口可能与ABusiness 位于不同的程序集中(例如),因此BBusiness 程序集不需要引用ABusiness 程序集。
请注意,您没有关注 Microsoft 的 capitalization conventions,这可能会使关注您的人难以维护此代码。 .NET 中的方法名称应该是 Pascal 大小写,例如 FunctionInABusiness()。