Мне не очень нравится идея, что ваш метод делает так много, то есть создает регистр и , но если он должен , то я бы подошел к нему, используя дженерики, скорее всего ,
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 может сделать это за вас, тогда, когда вы решите, вы получите экземпляр типа, который вы хотите, уважая время жизни, к которому он был настроен. Например, вы можете захотеть создать новый экземпляр, когда вы каждый раз разрешаете тип, или только новый экземпляр для каждого потока, или чтобы тот же экземпляр всегда возвращался при разрешении.
В любом случае, удачи!