0

我根本不希望这些内容是可编辑的。对于集合,使用 ReadOnlyCollection 似乎非常清楚(尽管我不知道它是否总是从集合中创建新的 ReadOnlyCollection 的好方法(成本高吗?))。

public static class Lookups
{
    private static Collection<MyBusinessObject> businessObjects;
    // [...]

    public static ReadOnlyCollection<MyBusinessObjects> BusinessObjects
    {
        get
        {
            return new ReadOnlyCollection<MyBusinessObject>(businessObjects);
        }
    }
    // [...]
}

但更重要的是:我如何处理集合中的项目?我希望这个测试通过任何想法?

    [TestMethod]
    public void Items_Should_Not_Be_Editable()
    {
        var businessObject = Lookups.BusinessObjects.First();

        businessObject.Id = 1337;

        Assert.AreNotEqual(1337, Lookups.BusinessObjects.First().Id);
    }
4

2 回答 2

2

您应该从接口继承 MyBusinessObject 并将其公开。

internal class MyBusinessObject : IMyBusinessObject {
    public string Id { get; set; }
}

public interface IMyBusinessObject {
    public string Id { get; }
}

然后在集合 MyCollection 中公开这个接口。

也许对集合做同样的事情,不要公开添加、删除等方法。

于 2012-10-31T08:33:36.540 回答
2

使用ReadonlyCollection时,您不必每次都创建一个新实例。另一种方法是公开一个 IEnumerable,因为它也是只读的。Readonlycollection 提供了更强的保护,如这里所示。

ReadOnlyCollection 泛型类的实例始终是只读的。只读集合只是一个带有防止修改集合的包装器的集合;因此,如果对基础集合进行了更改,则只读集合会反映这些更改。有关此类的可修改版本,请参见 Collection。

[Test]
public void TestNameTest()
{
    var names = new List<string>() {"Johan", "Tkrause"};
    var readOnlyCollection = new ReadOnlyCollection<string>(names);
    names.Add("Lars");
    Assert.AreEqual(3,readOnlyCollection.Count);
}

在你的情况下:

private List<IMyBusinessObjectType> _businessObjects= new List<IMyBusinessObjectType>();
private ReadOnlyCollection<IMyBusinessObjectType> _readOnlybusinessObjects;
public ReadOnlyCollection<IMyBusinessObjectType> BusinessObjects
{
    get
    {
        if(_readOnlybusinessObjects==null)
            _readOnlybusinessObjects=new ReadOnlyCollection<IMyBusinessObjectType>(_businessObjects);
        return _readOnlybusinessObjects;
    }
}
public interface IMyBusinessObjectType
{
    string Name { get; }
}

public class MyBusinessObjectType : IMyBusinessObjectType
{
    public string Name { get; set; }
}

至于业务对象,它们可以具有私有设置器或按照 Lars 的建议实现只读接口。

于 2012-10-31T08:45:05.123 回答