我正在开发一个基于C#的应用程序,其中我有一个带有内部后端的实用程序接口,它创建了一些对象并在应用程序内部注册它们。 所以代码如下所示:
public interface Utility {
public SomeObject CreateSomeObject(String id);
}
在我的程序集外只能看到Utility
接口,具体的后端类是内部的。
我真的很难找到创建方法的正确名称,该方法应告诉用户所需对象将创建和注册。
有什么建议吗?
编辑我已经考虑过命名我的方法CreateAndRegisterSomeObject(),但是有些对象的名字很长,这使得某些方法名称非常长
提前致谢,
答案 0 :(得分:4)
我真的不喜欢你的方法做得那么多的想法,即创建和注册,但如果它必须那么我会通过使用泛型来接近它最有可能的。
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
是一个已经解决的问题与Inversion of Control框架略有不同(例如ninject,unity其他)
它们允许您注册并将给定类型与对象具有的生命周期相关联。例如,如果您希望将类型注册为单例,IoC框架可以为您执行此操作,那么当您解决时,您将获得所需类型的实例,并考虑它已配置的生命周期。例如,您可能需要每次解析类型时的新实例,或每个线程只有一个新实例,或者在解析时始终返回相同的实例。
无论如何,祝你好运!
答案 1 :(得分:1)
你应该这样做。
使用工厂你会得到这样的东西:
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");
答案 2 :(得分:1)
首先,CreateAndRegister
(正如评论中所建议的)并不是一个“长”的名字。本周我可能已经写了更长命名的方法了。如果它是您方法的最佳描述,请使用它。
但是如果你想要一个更短的名字,你可能会考虑从类名中获得一些帮助。 “效用”是一个噪音词,如“经理”或“助手”;它绝对没有任何意义。所以IUtility
毫无意义;您也可以将其称为I
,以获取您从类型名称中获得的所有值。
但是,如果类型被命名为,例如IRegistrar
,那么在您开始编写方法名称之前,突然间您已经获得了有意义的上下文。注册器是注册事物的东西,如果它有返回值的方法,那么你知道它也会给你一些东西。现在你可以简单地命名方法 - 也许只是GetXxx
。它是创建某事的事实是显而易见的(它必须从某个地方获取它),并且它注册的事实隐含在类型名称中。
public interface IRegistrar {
Foo GetFoo(string id);
Bar GetBar(string id);
}
var myFoo = _registrar.GetFoo(id);