2017-01-16 76 views
1

我无法用英语解释我的问题。所以让我表明我的情况。C#松耦合

// in Main Project 
public class User 
{ 
    public int version 
    { 
     get; 
     set; 
    } 
} 


// in Common Project 
public class Service : BaseService 
{ 
    User _user; 
    public void SetVersion(int versionID) 
    { 
     _user.version = versionID; 
    } 

    public bool HasMessage() 
    { 
     return GetMessage(user.version); 
    } 
} 

现在我有另一个子项目。我需要在那里使用Service类。 所以我希望使Service类独立于User类。

我该怎么做?

我只有下面的解决方案。有没有什么精彩的方法?

public class Service : BaseService 
{ 
    Action<int> _getCallBack; 
    Func<int> _setCallBack; 

    public Service(Action<int> getCallback, Func<int> setCallBack) 
    { 
     _getCallback = getCallback; 
     _setCallback = setCallback; 
    } 

    public void SetVersion(int versionID) 
    { 
     setCallback(versionID); 
    } 

    public bool HasMessage() 
    { 
     return GetMessage(getCallback()) 
    } 
} 
+0

为什么主要项目中的用户名? – stuartd

+0

这看起来很适合继承?你的'用户'可以从'服务'派生?这是因为用户和服务之间存在1:1的链接。 –

+0

这些库是Opensource Project的一部分。我试图不改变那里的原始代码...所以它不是那么容易我改变体系结构..如果我有说服某些解决方案..我认为启动新的分支或新的存储库 –

回答

1

这取决于您在使用“用户”服务。 您可以在Common项目中添加一个IUser接口,并让用户执行它。

然后在另一个子项目中写入UserSub:IUser,它也实现了IUser接口。

这样服务是独立的,但是你仍然必须在每个使用服务的项目中实现一些东西。 (无论如何你需要这样做,因为服务目前使用它作为内部变量。

+1

我喜欢这个解决方案。 。我需要更改整个架构...用户已经继承了许多基本规则和接口。所以我不能把它移到常见的项目..我必须考虑依赖..和建筑..感谢评论。它帮助了我很多 –

+0

我很高兴我可以帮助:)如果它解决了您的问题,请将其标记为答案。 –

1

是的,有几个允许解耦组件的最佳实践,他们被称为设计模式。我建议看看他们所有人以确定哪一个最适合你的上下文,它们各有优缺点,适用范围和影响力,没有一个明智的解耦方案,

我认为命令模式可以是你的问题的正确选择

参见:http://www.dofactory.com/net/design-patternshttps://csharpdesignpatterns.codeplex.com

+0

我不知道为什么这是downvoted - 这是一个很好的(虽然,更苛刻)的答案,这些链接值得检查和了解。 –