删除"工厂"< - >"具体实施"依赖

时间:2015-05-25 12:06:01

标签: php design-patterns factory circular-dependency

我有一家"供应商工厂"它创建了具体提供者的实现。要创建正确的实现,除了其他参数之外,还需要 typeId 。 问题是,为了将正确的 typeId 传递给工厂,我需要验证并在必要时进行更改。 为了做到这一点,在其他参数中,我需要一个特定提供者的实例。问题出在哪里 - 提供者应该是单例(我真的不想让它成为具有大写S的Singleton),因为它查询数据库并将结果缓存在内部属性中。

所以我的问题是 - 是否有更合适的模式或其他方式来实现类似的东西?

public class provider
{
    public int id { get; set; }

    [Display(Name = "Username")]
    [StringLength(
        maximumLength: 100,
        MinimumLength = 2,
        ErrorMessageResourceType = typeof(Resources.Messages),
        ErrorMessageResourceName = "StringLength")]
    [Required(
        AllowEmptyStrings = false,
        ErrorMessageResourceType = typeof(Resources.Messages),
        ErrorMessageResourceName = "Required")]
    public string username { get; set; }

    [Display(Name = "Password")]
    [StringLength(
        maximumLength: 100,
        MinimumLength = 2,
        ErrorMessageResourceType = typeof(Resources.Messages),
        ErrorMessageResourceName = "StringLength")]
    [Required(
        AllowEmptyStrings = false,
        ErrorMessageResourceType = typeof(Resources.Messages),
        ErrorMessageResourceName = "Required")]
    public string password { get; set; }

    [Display(Name = "Email")]
    [StringLength(
        maximumLength: 100,
        MinimumLength = 2,
        ErrorMessageResourceType = typeof(Resources.Messages),
        ErrorMessageResourceName = "StringLength")]
    public string email { get; set; }

    public virtual information information { get; set; }
}

1 个答案:

答案 0 :(得分:1)

我建议您在ProviderFactory中实现ChainOfResponsibility模式,这样您每次添加新的Provider或更改逻辑时都不需要修改ProviderFactory。您只需要添加RegisterProvider(IProvider提供程序)方法来在链中添加提供程序,然后循环遍历这个提供程序链,调用每个IProvider的bool:DoesProviderSuit(int typeId,out IProvider)。

希望你能抓住一个主意,祝你好运!

相关问题