gpt4 book ai didi

c# - 创建一个虚拟容器以便可以重新分配内部对象而不丢失? (C#)

转载 作者:太空宇宙 更新时间:2023-11-03 14:12:28 24 4
gpt4 key购买 nike

我有一个对象在我的一个类(class)中被广泛使用。但是,我有另一个类存储对该对象的引用,稍后可能需要重新分配它。

众所周知,如果一个类包含对存储为成员变量的对象的引用,然后重新分配给它,那么引用就会丢失,现在有两个对象。

有人可能会质疑 ref 关键字的使用,但不幸的是我不能,因为我将成员变量存储在对象构造函数中,然后在类的一个方法中重新分配它。

这个问题的解决方案是创建一个小的虚拟容器类并传递它,然后在两个类之间共享这个虚拟容器。然后两个类都可以随意重新分配内部成员变量,它永远不会丢失或复制。

现在您可能会想,“看来您已经有了答案!您的问题是什么?”好吧,我没有一个确切的问题。我只是想知道这种事情是否已经完成。它是反模式吗?有没有更好的办法?重构?

感谢阅读。

最佳答案

看看 ComponentModel 架构。你有IServiceProvider接口(interface),它有 GetService 方法来获取注册服务的实例。还有 IServiceContainer接口(interface)具有用于取消注册现有服务和注册新服务的附加方法,然后可以在外部范围内使用。框架中已经有一个实现,ServiceContainer类,可以使用。

class A
{
private readonly IServiceContainer _services;
public A(IServiceContainer services)
{
_services = services;
}

public void Call()
{
var service = (ISomeService)_services.GetService(typeof(ISomeService));
service.DoSomething();
}

public void ChangeService()
{
// set the new service instance as
// the ISomeService in the service container
var newService = new SomeService();
_services.RemoveService(typeof(ISomeService), true);
_services.AddService(typeof(ISomeService), newService);
}
}

然后你可以这样做:

var svc = new ServiceContainer();
var a1 = new A(svc);
var a2 = new A(svc);
a1.ChangeService();
a1.Call(); // call the created service
a2.Call(); // the service created in a1 will be called
a2.ChangeService();
a1.Call(); // the service created in a2 will be called

关于c# - 创建一个虚拟容器以便可以重新分配内部对象而不丢失? (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7420388/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com