当注入的对象是有条件的时,C#IoC实例化
我有一个国际奥委会的问题,目前是抽象的。我还没有选择一个IoC框架来开始编码。我仍然在心里计划着我将要用于一个即将到来的项目的方法 我的编码风格通常遵循以下模式:当注入的对象是有条件的时,C#IoC实例化,c#,dependency-injection,inversion-of-control,C#,Dependency Injection,Inversion Of Control,我有一个国际奥委会的问题,目前是抽象的。我还没有选择一个IoC框架来开始编码。我仍然在心里计划着我将要用于一个即将到来的项目的方法 我的编码风格通常遵循以下模式: 某种处理器被实例化并传递给业务对象 处理器将依次实例化验证器,以验证传递的业务对象对于给定流程是否有效 如果发现业务对象有效,则将实例化持久化对象。持久化对象负责转换,如加密、缓存,以及在对象图的单个事务中将多个请求分组在一起 然后,业务对象实例化一个数据层,该数据层的任务是将业务对象持久化到数据库中,或者根据具体情况从数据库中提取
- 某种处理器被实例化并传递给业务对象李>
- 处理器将依次实例化验证器,以验证传递的业务对象对于给定流程是否有效李>
- 如果发现业务对象有效,则将实例化持久化对象。持久化对象负责转换,如加密、缓存,以及在对象图的单个事务中将多个请求分组在一起李>
- 然后,业务对象实例化一个数据层,该数据层的任务是将业务对象持久化到数据库中,或者根据具体情况从数据库中提取它(或者数据所在的文本文件或Web服务)
- 我的理想结构是,处理器知道验证器和Perience对象,但不知道AccessLayer。持久化对象知道访问层,但不能直接实例化或调用进程。这样就有了明确定义的层,可以根据需要进行分离
- 最后,这个过程对输入或输出是不可知的,并且根据应用程序类型是不可变的。换句话说,我可以使用与桌面应用相同的处理器在web应用中添加业务对象。显然,模型/视图/控制器将根据应用程序类型而改变,但是添加或选择业务对象的规则仍然是通用的
public class VagueProcessor{
public VagueProcessor(IValidator validator,
IPersistence persistence,
IAccessLayer accessLayer,
ISettings settings) { ... }
}
这是我的难题。在我正在规划的应用程序中,业务对象有各种各样的实现,每个实现都有自己的可配置规则。假设一个BO代表加利福尼亚州,另一个BO代表纽约州,两个州都有自己的特殊规则,由各自的管理机构进行验证。因此,验证器可以是CAValidator或NYValidator,这取决于业务对象的状态
好的,在所有这些前导和后记之后,我的问题是:在这个场景中,我会将一个验证器工厂传递给处理器,工厂会根据业务对象的状态实例化适当类型的验证器吗?如果是这样的话,我会用IoC容器注册每种类型,还是只注册工厂
谢谢你对这件事的想法 这是一个模糊的问题,因为你还没有问题,只有想法 根据我对你问题的理解,我想说:
factory.CreateValidatorFrom(myBusinessObject)
的问题IServiceProvider
传递到工厂,并在工厂内部调用serviceProvider.GetService()
。所有DI提供者都会有这样一个对象public class ValidateMe : IValidatableObject
{
[Required]
public bool Enable { get; set; }
[Range(1, 5)]
public int Prop1 { get; set; }
[Range(1, 5)]
public int Prop2 { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (!this.Enable)
{
/* Return valid result here.
* I don't care if Prop1 and Prop2 are out of range
* if the whole object is not "enabled"
*/
}
else
{
/* Check if Prop1 and Prop2 meet their range requirements here
* and return accordingly.
*/
}
}
}
这也可以通过使用来完成,以确保在接口和/或属性可用于处理时始终发生
注意:术语业务对象意味着您希望使用知道如何保存和检索自身状态的对象(内部实现CRUD)构建某种智能对象框架。这种设计不太适合DI。这并不是说你不能同时使用DI和智能对象设计,它只是更难构建,更困难
if (validationService.IsValid(model));
{
// persist
}
var productDetails = this.queryProcessor.Execute(new GetProductDetailsQuery
{
ProductId = id
});
// This command executes a long and complicated workflow,
// but this is all that is done inside of the action method
var command = new AddToCartCommand
{
ProductId = model.Id,
Quantity = model.Qty,
Selections = model.Selections,
ShoppingCartId = this.anonymousIdAccessor.AnonymousID
};
this.addToCartHandler.Handle(command);