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で公開します。

たぶん、コレクションに対して同じことを行い、add、removeなどのメソッドを公開しないでください。

于 2012-10-31T08:33:36.540 に答える
2

ReadonlyCollectionを使用する場合、毎回新しいインスタンスを作成する必要はありません。別の方法は、IEnumerableも読み取り専用であるため、公開することです。Readonlycollectionは、ここで見られるように、より強力な保護を提供します。

ReadOnlyCollectionジェネリッククラスのインスタンスは常に読み取り専用です。読み取り専用のコレクションは、コレクションの変更を防ぐラッパーを備えたコレクションです。したがって、基になるコレクションに変更が加えられた場合、読み取り専用コレクションはそれらの変更を反映します。このクラスの変更可能なバージョンについては、コレクションを参照してください。

[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 に答える