生成器或其他一些模式,始终在有效状态下创建实例

时间:2009-10-28 17:09:28

标签: c# lambda modeling builder

我有一个非常复杂的对象设置,每个选择都限制或扩展了可用的选项。我不想抛出异常或创建对象的无效实例。 因此,我想在基于先前方法输入参数构建实例时限制选项(可调用的方法)。例如,如果我有一些规则说明用户是否为“A”类型,那么允许将其添加到角色,否则如果它是“B”类型请求位置,如果位置是特定的邮政编码...你得到这个想法

这是否可以使用匿名方法,类型,无论

用户类型A

UserBuilder builder = new UserBuilder
builer.Build().ForType("A").WithRoles(rolesList);

用户类型B

UserBuilder builder = new UserBuilder
builer.Build().ForType("B").WithLocations(locationList);

更新: 所以基本上我的问题是,有没有办法限制api中的所有其他公共方法选项,除了基于对象状态的有效选项。

2 个答案:

答案 0 :(得分:2)

是的,这在理论上是可行的。 (虽然不太可能涉及匿名方法/类型。)

然而,使用将是一个噩梦。不幸的是,如果你将这些类型的限制放在使用流畅的界面中,你几乎需要知道规则来理解如何“构建”这种类型。

我更希望为不同类型的用户制作专门的用户子类。让每个子类的构造函数都需要正确初始化它们所需的参数,并根据需要公开方法和属性。

这样,您只需创建适当的用户:

UserA userA = new UserA(rolesList); // This requires roles to construct
UserB userB = new UserB(locationList); // This requires locations to construct

答案 1 :(得分:0)

您可以执行类似下面的代码,这显然只是一个概念。问题是你必须为链中的每个类型编写方法调用来维护流畅的接口。

class Program
{
    static void Main(string[] args)
    {
        var builder = new UserBuilder();
        builder.BuildTypeA().WithRoles("a,b");
        builder.BuildTypeB().WithLocations("c,d");
    }
}

public abstract class User {}
public class UserA : User {}
public class UserB : User {}

public class UserBuilder
{
    public UserABuilder BuildTypeA() { return new UserABuilder(); }
    public UserBBuilder BuildTypeB() { return new UserBBuilder(); }
}

public class UserABuilder
{
    public UserABuilder WithRoles(string roles)
    {
        // add roles
        return this;
    }
}

public class UserBBuilder
{
    public UserBBuilder WithLocations(string locations)
    {
        // add locations
        return this;
    }
}