创建并注册命名模式

时间:2012-02-17 12:52:44

标签: c# .net design-patterns

我正在开发一个基于C#的应用程序,其中我有一个带有内部后端的实用程序接口,它创建了一些对象并在应用程序内部注册它们。 所以代码如下所示:

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

在我的程序集外只能看到Utility接口,具体的后端类是内部的。 我真的很难找到创建方法的正确名称,该方法应告诉用户所需对象将创建注册。 有什么建议吗?

编辑我已经考虑过命名我的方法CreateAndRegisterSomeObject(),但是有些对象的名字很长,这使得某些方法名称非常长

提前致谢,

3 个答案:

答案 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框架略有不同(例如ninjectunity其他)

它们允许您注册并将给定类型与对象具有的生命周期相关联。例如,如果您希望将类型注册为单例,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);