Создать и зарегистрировать шаблон именования - PullRequest
0 голосов
/ 17 февраля 2012

Я работаю над приложением на C #, в котором у меня есть служебный интерфейс с внутренним внутренним интерфейсом, который создает некоторые объекты и регистрирует их внутри приложения.Таким образом, код выглядит следующим образом:

public interface Utility {
     public SomeObject CreateSomeObject(String id);
}

Только интерфейс Utility виден снаружи моей сборки, конкретный внутренний класс является внутренним.Я действительно застрял в поиске подходящего имени для методов создания, которые должны сообщить пользователю, что требуемый объект будет создан и зарегистрирован .Есть предложения?

EDIT Я уже думал о присвоении имен моим методам CreateAndRegisterSomeObject (), но некоторые объекты имеют действительно длинные имена, что делает имена некоторых методов очень очень длинными

Заранее спасибо

Ответы [ 3 ]

4 голосов
/ 17 февраля 2012

Мне не очень нравится идея, что ваш метод делает так много, то есть создает регистр и , но если он должен , то я бы подошел к нему, используя дженерики, скорее всего ,

public interface IUtility {
    T CreateAndRegister<T>(String id) where T : IIdentifiable, new();
    T CreateAndRegister<T>(ComplexInitInfo somethingElse) where T : ISomethingElseable, new();
}

Это позволит вам обслуживать несколько классов, имеющих один и тот же шаблон построения, без добавления подробного кода, т. Е. Необходимости создавать методы, содержащие имя каждого отдельного объекта, который необходимо создать и зарегистрировать. Пусть дженерики сделают тяжелую работу за вас.

Ваши объекты должны будут реализовать некоторые интерфейсы, такие как

public interface IIdentifiable
{
    string Id { get; set; }
}

public class ComplexInitInfo
{
    public int SomeId { get; set; }
    public string SomethingElse { get; set; }
}

// this is just an example
public interface ISomethingElseable : IIdentifiable
{
    string SomethingElse { get; set; }
}

Тогда вы могли бы реализовать свой класс Utility следующим образом:

public class Utility : IUtility
{
    public T CreateAndRegister<T>(string id) where T : IIdentifiable, new()
    {
        T result = new T();
        result.Id = id;

        // do your registration 

        return result;
    }

    public T CreateAndRegister<T>(ComplexInitInfo somethingElse) where T : ISomethingElseable, new()
    {
        T result = new T();
        result.Id = somethingElse.SomeId;
        result.SomethingElse = somethingElse.SomethingElse;

        // do your registration 

        return result;
    }
}

Другой подход

Я также хотел бы указать на шаблон, который вы пытаетесь использовать CreateAndRegister - это проблема, которая уже решена немного по-другому с Инверсиями управления (например, ninject , единство среди прочих)

Они позволяют вам регистрировать и связывать данный тип с временем жизни, которое имеет объект. Если вы хотите зарегистрировать типы как синглтоны, например, платформа IoC может сделать это за вас, тогда, когда вы решите, вы получите экземпляр типа, который вы хотите, уважая время жизни, к которому он был настроен. Например, вы можете захотеть создать новый экземпляр, когда вы каждый раз разрешаете тип, или только новый экземпляр для каждого потока, или чтобы тот же экземпляр всегда возвращался при разрешении.

В любом случае, удачи!

1 голос
/ 17 февраля 2012

Прежде всего, CreateAndRegister (как предлагается в комментариях) вряд ли является «длинным» именем. Я, вероятно, написал методы с более длинными именами только на этой неделе. Если это лучшее описание для вашего метода, используйте его.

Но если вы хотите более короткое имя, вы можете подумать о том, чтобы получить некоторую помощь от имени класса. «Утилита» - это шумовое слово, например «Менеджер» или «Помощник»; это не добавляет абсолютно никакого смысла. Так что IUtility не имеет смысла; с тем же успехом можно назвать его I для всех значений, которые вы получаете из имени типа.

Но если тип был назван, скажем, IRegistrar, то внезапно вы получили осмысленный контекст еще до того, как начали писать имя метода. Регистратор - это что-то, что регистрирует вещи, и если у него есть методы с возвращаемыми значениями, то вы знаете, что оно также возвращает вам что-то. Теперь вы можете назвать метод как-то кратко - возможно, просто GetXxx. Тот факт, что он создает что-то очевидное (его нужно откуда-то получить), и тот факт, что он регистрирует , это подразумевается в имени типа.

public interface IRegistrar {
    Foo GetFoo(string id);
    Bar GetBar(string id);
}

var myFoo = _registrar.GetFoo(id);
1 голос
/ 17 февраля 2012

Вы должны сделать это так.

Используя фабрику, вы получите что-то вроде этого:

public Class Factory
{
     public static object CreateAndRegister(string className)
     {
         Assembly assem = Assembly.GetExecutingAssembly();
         Object obj = assem.CreateInstance(className, false);

         //Code for registration          

         return obj;
     }
}

В коде

SomeObj obj = (SomeObj)Factory.CreateAndRegister("SomeObj");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...