如何在不滥用静态方法的情况下从任何地方访问对象?

问题描述 投票:0回答:2

此问题与桌面应用程序有关。

我一直在思考的东西,是一种能够访问可被视为全局的对象的方法,就像它被声明为静态的一样。但我总是避免这种情况。

例如,在应用程序中,经常出现User对象(或类似的东西)。想象一下,从业务逻辑的某个地方使用数据模型/存储库,您需要用户ID将其作为参数传递给数据层,以便它可以为用户加载相应的数据。在Web应用程序中大多数时候,我看到像用户ID这样的信息来自URL参数或HTTP post数据,并通过其action方法发送到控制器。

在桌面应用程序中,这是不同的,因为所有“状态”保持不变。假设用户对象在程序启动时构造一次,当然现在存储在某处的内存中。如何从应用程序的其他部分访问它?似乎只有两个选择:

  1. 在包含用户对象的常规类上使用静态方法,该用户对象返回它。
  2. 通过需要该对象的整个类树注入用户对象。

我认为这两种选择都很丑陋而且不是最优的。由于我认为这是一种非常普遍的情况,保持良好结构的最佳做法是什么?

c# design-patterns data-structures architecture software-design
2个回答
0
投票

我不确定为什么你认为#2是“丑陋而不是最优”,但是不是注入一个User对象,也许注入一个IUserService,它有获取当前用户对象的方法将是一种考虑的方法。

我在使用Microsoft Unity的各种桌面应用程序中做了类似的事情,但是你可以在各种DI框架上考虑很多选项。我不确定你对DI的熟悉程度如何,并且有大量的文章,但我发现这个概念的一个不错的起点是Microsoft patterns & practices Developer Center以及关于Unity的一些介绍文档,当然还有最新的Git Hub上的Unity Container Documentation

如果您对如何实施此类模式有具体问题,请再发一篇文章。


0
投票

我猜您使用的是WinForms或WPF应用程序,您将其称为桌面应用程序。如果是这样,您肯定可以利用众多IoC容器中的一个以全局方式存储对象,然后在需要时访问它。但是,我认为对于简单的场景来说,这是不值得的。

一个简单的解决方案是使用静态工厂,可以在需要时创建对象,或者将其存储为静态对象,以便它在整个应用程序中可用,前提是它的状态保持不变。您可以添加泛型方法来返回T类型的对象,也可以添加特定方法来创建可能需要某些逻辑的对象。

public static class ObjectFactory
{
    public static T GetObject<T>() where T : new()
    {
        return new T();
    }

    public static User GetUserObject(param1, param2)
    {
        // some logic
        ....
        return new User();
    }
}

如果不需要每次都创建对象,则可以修改上面的代码以将其存储在字典中。请确保您没有在内存中存储过多对象的字典,并且如果您不需要它,也可以添加一个方法来删除该对象。

public static class ObjectFactory
{
    private static Dictionary<string, object> collection = new Dictionary<string, object>();

    public static T GetObject<T>() where T : new()
    {
        string key = typeof(T).ToString();

        if (collection.ContainsKey(typeof(T).ToString()))
            return (T)collection[key];

        var instance = new T();

        collection.Add(key, instance);

        return instance;
    }
}

将IoC框架用于桌面应用程序的问题在于它们没有像Web应用程序那样的应用程序生命周期。应用程序启动后,没有类似方案的请求/响应。您将显示可能打开其他表单的主表单,依此类推。

如果您正在寻找更复杂的解决方案,其中涉及解决表单实例以及依赖项。请查看answer以查找可能重复的问题。

我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.