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);