Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#访问属性值的松耦合_C#_Design Patterns - Fatal编程技术网

C#访问属性值的松耦合

C#访问属性值的松耦合,c#,design-patterns,C#,Design Patterns,我想创建松散耦合的类(PlayerProfile和PlayersManager),并能够从PlayersManager访问PlayerScore属性的值(该属性在PlayerProfile中实现)(不知道PlayerProfile) PS:我不知道使用接口是正确的方法还是有其他方法 你知道我怎样才能做到这一点吗? 感谢您详细介绍我的评论: public interface IClass { int PlayerScore { get; } } public class ClassA

我想创建松散耦合的类(
PlayerProfile
PlayersManager
),并能够从
PlayersManager
访问
PlayerScore
属性的值(该属性在
PlayerProfile
中实现)(不知道
PlayerProfile

PS:我不知道使用接口是正确的方法还是有其他方法

你知道我怎样才能做到这一点吗? 感谢您详细介绍我的评论:

public interface IClass
{
     int PlayerScore { get; }
}

public class ClassA : IClass
{
    public int PlayerScore { get; } = 250;
}

public class ClassB
{
    public ClassB(IClass aClass)
    {
        _aClass = aClass;
        // Now you can use _aClass.PlayerScore in the other methods
    }
    private readonly IClass _aClass;
}
现在,在阅读更新的代码之后:

public interface IPlayerProfile
{
     int PlayerScore { get; }
}

public class Player : IPlayerProfile
{
    public int PlayerScore { get; } = 250;
}

public class PlayersManager
{
    public Add(IPlayerProfile profile)
    {
        // Use profile.PlayerScore
    }
}

您可以使用构造函数注入。这是一个很好的例子。另见:


可以自动创建和注入依赖项。它们是这样工作的(当然,不同的依赖注入框架的细节有所不同):

在静态类中创建依赖项注入容器

public static class DI
{
    public static SomeContainer Container { get; } = new SomeContainer();
}
在程序启动时注册您的服务

DI.Container.Register<IPlayer, PlayerProfile>();
DI.Container.Register<PlayersManager>();
它的作用与

IPlayer temp = new PlayerProfile();
var pm = new PlayersManager(temp);

您可以将一个
IClass
实例(可能是ClassA实例,也可能不是)传递给ClassB的方法(例如它的构造函数)@vc74您能详细介绍一下我是如何做到的吗?这个问题非常不清楚。您需要解释
ClassB
ClassA
/
IClass
之间的关系。就目前而言,我不知道你的想法asking@WadjeyClassB将拥有构造函数
public ClassB(IClass classObject){}
,然后您可以从
classObject
参数访问
PlayerScore
,您知道
IClass myClass=new ClassA()
完全有效?对于OPs供参考,这是一种依赖注入模式。@vc74感谢您的帮助
DI.Container.Register<IPlayer, PlayerProfile>();
DI.Container.Register<PlayersManager>();
// This automatically creates a `PlayerProfile` object and a `PlayersManager` object by
// injecting the player profile into the constructor of the manager.
var pm = DI.Container.Resolve<PlayersManager>();
IPlayer temp = new PlayerProfile();
var pm = new PlayersManager(temp);