国际奥委会和微软 类
IoC and Microsoft classes
我刚开始使用 Ioc,我想知道我应该如何注入 Microsoft classes。具体来说,我正在使用 DirectorySearcher。我可以注射这个吗?我不这么认为。
所以我为 DirectorySearcher 制作了一个包装器 class,并创建了一个工厂方法。所以我可以在我需要的地方注入我的包装器 class,然后调用工厂 'Create' 方法。这是处理这种情况的方法吗?或者我需要整个工厂 class?
public class Directory
{
public Directory() { }
public static Directory Create(string userName, string password, string ldapPath)
{
var entry = new DirectoryEntry(path, userName, password, AuthenticationTypes.Secure);
var searcher = new DirectorySearcher(entry);
return new Directory() { Searcher = searcher };
}
}
我担心的是我的包装器与 DirectorySearcher 紧密耦合。为了测试,我真的需要访问我的实时广告。
根据Agile Principles, Patterns, and Practices:
clients [...] own the abstract interfaces
这意味着您应该以对消费者有意义的方式定义接口;不是 目标。其他人称这个概念为 ports and adapters,其中端口是应用程序使用的抽象,适配器是将调用转换为外部系统(在您的情况下为 LDAP)的接口的实现。
因此,尽管您可以创建一个 'adapter' 允许您使用 LDAP 创建目录,但您的实现会泄露实现细节,例如您需要某些凭证以及需要提供的事实一个 ldapPath
。这些都违反了Dependency Inversion Principle,因为:
Abstractions should not depend on details.
因此,请尝试找出适用于您的应用程序的抽象是什么。您可能希望在更高级别上定义抽象。例如,创建目录实际上不太可能是用户想要执行的用例。相反,用例可能类似于创建一个新的用户帐户,为了实现这一点,该用例中的一个步骤是创建一个目录。
因此请考虑您的应用程序需要什么,并避免在其中指定任何细节。但老实说,这真的很难。我花了很多时间才能够做到这一点,而且大多数时候我仍然第一次弄错了我的抽象概念。诀窍是能够接受你的错误并改进设计。一步一个脚印。
所以你的设计应该是什么样子,我不知道。我不知道你想要完成什么,即使我知道,我可能仍然会给你错误的建议。但我知道一件事,创建工厂通常不是解决方案。它只是移动了问题。不要误会我的意思,工厂仍然是一个有效的设计模式,但如果您正确应用 SOLID principles 和依赖注入,您将不会经常需要它们。
我刚开始使用 Ioc,我想知道我应该如何注入 Microsoft classes。具体来说,我正在使用 DirectorySearcher。我可以注射这个吗?我不这么认为。
所以我为 DirectorySearcher 制作了一个包装器 class,并创建了一个工厂方法。所以我可以在我需要的地方注入我的包装器 class,然后调用工厂 'Create' 方法。这是处理这种情况的方法吗?或者我需要整个工厂 class?
public class Directory
{
public Directory() { }
public static Directory Create(string userName, string password, string ldapPath)
{
var entry = new DirectoryEntry(path, userName, password, AuthenticationTypes.Secure);
var searcher = new DirectorySearcher(entry);
return new Directory() { Searcher = searcher };
}
}
我担心的是我的包装器与 DirectorySearcher 紧密耦合。为了测试,我真的需要访问我的实时广告。
根据Agile Principles, Patterns, and Practices:
clients [...] own the abstract interfaces
这意味着您应该以对消费者有意义的方式定义接口;不是 目标。其他人称这个概念为 ports and adapters,其中端口是应用程序使用的抽象,适配器是将调用转换为外部系统(在您的情况下为 LDAP)的接口的实现。
因此,尽管您可以创建一个 'adapter' 允许您使用 LDAP 创建目录,但您的实现会泄露实现细节,例如您需要某些凭证以及需要提供的事实一个 ldapPath
。这些都违反了Dependency Inversion Principle,因为:
Abstractions should not depend on details.
因此,请尝试找出适用于您的应用程序的抽象是什么。您可能希望在更高级别上定义抽象。例如,创建目录实际上不太可能是用户想要执行的用例。相反,用例可能类似于创建一个新的用户帐户,为了实现这一点,该用例中的一个步骤是创建一个目录。
因此请考虑您的应用程序需要什么,并避免在其中指定任何细节。但老实说,这真的很难。我花了很多时间才能够做到这一点,而且大多数时候我仍然第一次弄错了我的抽象概念。诀窍是能够接受你的错误并改进设计。一步一个脚印。
所以你的设计应该是什么样子,我不知道。我不知道你想要完成什么,即使我知道,我可能仍然会给你错误的建议。但我知道一件事,创建工厂通常不是解决方案。它只是移动了问题。不要误会我的意思,工厂仍然是一个有效的设计模式,但如果您正确应用 SOLID principles 和依赖注入,您将不会经常需要它们。