如何在初始化静态类之前初始化静态属性?

3
下面的Class2有一个需要在调用GetSomething之前设置的属性。然而,因为我在Class1的顶部访问了Class2,所以当它到达Something类时,该属性总是空值。我似乎无法想出如何更改我的代码以在使用属性之前设置它。有人能帮忙吗?
编辑: 我想从form1的构造函数中传递依赖项,而不是在上游硬编码它。
public partial class form1
{
    private static readonly ISomeConstructedClass someConstructedClass = Class1.SomeConstructedClass;
    public form1()
    {
        someConstructedClass.SomeDependency = new SomeDependency();
        someConstructedClass.Whatever();
    }
}
public static class Class1
{
    public static readonly ISomething something = (ISomething)Class2.GetSomething("something");
    public static ISomeConstructedClass SomeConstructedClass
    {
     get
     {
       return something.SomeConstructedClass;
     }
    }

} .... }

public class Class2
{   
    public static ISomeDependency SomeDependency
    {
       get;
       set;
    }
    public static GetSomething(string something)
    {
         switch(something)
         {
            case "something":
               return new Something( SomeDependency );
         }         
    }
}

  public class Something : ISomething
  {
      public ISomeDependency SomeDependency
      {
           get;
           set;
      }
      public Something(ISomeDependency someDependency)
      {
           SomeDependency = someDependency;
      }
  }

1
你在哪里初始化属性? - SLaks
@SLaks - 我添加了更多的代码,希望能回答你的问题。 - O.O
@Cemafor - 不是吗?form1是应用程序的入口,这就是依赖关系的创建位置,然后的想法是将其传递给所有需要它的其他类。这样,我就能够向所有其他类传递一个虚假的对象。 - O.O
有没有实现 ISomeDependancy 接口的对象? - terrybozzio
你的getsomething方法真的是这样吗?没有返回值?如果是这样的话甚至无法编译... - terrybozzio
显示剩余5条评论
2个回答

2

[修改后]:

之前我对你的意图有些困惑,实际上你只需要先创建依赖关系即可。

public partial class form1
{
    private static /*readonly*/ ISomeConstructedClass someConstructedClass;
    public form1()
    {
        Class2.SomeDependency = new SomeDependency();
        someConstructedClass = Class1.SomeConstructedClass;
        someConstructedClass.Whatever();
    }
}

我也会将某些东西的创建移至属性中,以确保它不会在form1构造函数之前过早地初始化。

public static class Class1
{
    public static ISomething something;
    public static ISomeConstructedClass SomeConstructedClass
    {
        get
        {
            if (something == null) {
                something = (ISomething)Class2.GetSomething("something");
            }
            return something.SomeConstructedClass;
        }
    }
}

你可以使用静态构造函数(static constructor)。这个函数会在任何静态(或实例)字段或方法被调用/访问之前被调用。

示例代码如下:

static Class2() {
    SomeDependency = SomeDependencyYouNeed;
}

如果在构造函数中硬编码ISomeDependency,那么这看起来很好,因为静态构造函数是无参数的。 - Taylor
@Taylor:是的,我不确定他实际上想从哪里获取依赖项,所以我想提供一些可能有帮助的东西。 - Cemafor
@Cemafor - 你不能在非静态构造函数中分配静态只读字段,因此你上面的代码不起作用 :( - O.O
@O.O 很好的发现,我忽略了静态修饰符...但是必须做出一些改变。如果直到创建 form1 实例才知道依赖关系,您可能需要将 someConstructedClass 降级为非只读。 - Cemafor
@O.O:我猜你可以设置某种事件,当在Class2中设置依赖项时,它会推送出去,但我认为最好重新设计,不要有太多(或任何)静态方法/参数。 - Cemafor
@Cemafor - 不错。我知道我在思考过度。 - O.O

0
为什么要使用静态方法?这看起来像是你在尝试一种依赖注入。可以通过创建Class2的实例并将依赖项传递给构造函数(不要使用静态方法),或者将依赖项作为GetSomething()方法的参数传递来解决。
public static GetSomething(string something, ISomeDependency dependency).

并非所有的“某些东西”都需要这个依赖项,因此将其传递给GetSomething没有意义。 - O.O

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接