我是StructureMap的新手,我收到以下错误:
StructureMap异常代码:202 No. 为。定义的默认实例 PluginFamily Company.ProjectCore.Core.IUserSession, Company.ProjectCore,Version = 1.0.0.0, Culture = neutral,PublicKeyToken = null
它似乎是在编译时遇到第一个接口实例 然后抛出上述错误:
private readonly IUserSession _userSession;
public SiteMaster()
{
_userSession = ObjectFactory.GetInstance<IUserSession>(); // ERROR THROWN HERE
...
}
对于它的价值,我在所有接口上面都有PluginFamily引用:
[PluginFamily("Default")]
public interface IUserSession
以下是我的整个StructureMap.config
<StructureMap>
<Assembly Name="Company.ProjectWeb" />
<Assembly Name="Company.ProjectCore" />
<!--
Use DefaultKey="Default" for standard cache
or DefaultKey="MemCached" for memcached cache.
-->
<PluginFamily
Assembly="Company.ProjectCore"
Type="Company.ProjectCore.Core.ICache"
DefaultKey="MemCached" />
<!--
Use DefaultKey="Default" for sending the email
in real time through the configured mail server
or use DefaultKey="MailQueue" to send the mail
in batches through another process
-->
<PluginFamily
Assembly="Company.ProjectCore"
Type="Company.ProjectCore.Core.IEmailService"
DefaultKey="MailQueue" />
<!--
Use DefaultKey="Default" for standard cache
or DefaultKey="UserSession" for memcached cache.
-->
<PluginFamily
Assembly="Company.ProjectCore"
Type="Company.ProjectCore.Core.IUserSession"
DefaultKey="UserSession" />
<!--
Use DefaultKey="Default" for standard cache
or DefaultKey="Redirector" for memcached cache.
-->
<PluginFamily
Assembly="Company.ProjectCore"
Type="Company.ProjectCore.Core.IRedirector"
DefaultKey="Redirector" />
<!--
Use DefaultKey="Default" for standard cache
or DefaultKey="Navigation" for memcached cache.
-->
<PluginFamily
Assembly="Company.ProjectCore"
Type="Company.ProjectCore.Core.INavigation"
DefaultKey="Navigation" />
有什么建议吗?感谢。
答案 0 :(得分:2)
乍一看,配置对我来说是正确的。你在发布的代码运行之前调用了ObjectFactory.Initialize吗?
我自己(不再)使用属性或配置文件,但我认为你不需要同时使用它们。
此外,您是否有理由首先使用属性和/或XML?你可以通过一个流畅的界面使用StructureMap通过代码配置你的实例,而恕我直言这是一个更好的方法(除非你需要在生产中交换实现,但即便如此,还有其他选项)。
另见: http://structuremap.github.com/structuremap/ConfiguringStructureMap.htm
评论后更新
好的,所以我下载了应用程序,但无法让它运行,并且无法真正花时间进行故障排除。如果我再也无法提供帮助,我很抱歉。
然而,我确实非常简短地解释了代码,我可以肯定地告诉你,我看到的使用IOC / DI的一些代码非常令人不安。除非这是本书然后向您展示如何重构的入门代码,否则我不建议将其作为学习IOC模式或StructureMap的源。
以下是错误代码的示例:
public AccountService()
{
_accountRepository = ObjectFactory.GetInstance<IAccountRepository>();
_permissionRepository = ObjectFactory.GetInstance<IPermissionRepository>();
_userSession = ObjectFactory.GetInstance<IUserSession>();
_redirector = ObjectFactory.GetInstance<IRedirector>();
_email = ObjectFactory.GetInstance<IEmail>();
_profileService = ObjectFactory.GetInstance<IProfileService>();
_webContext = ObjectFactory.GetInstance<IWebContext>();
_friendService = ObjectFactory.GetInstance<IFriendService>();
}
对我而言,这是一个明确的全球服务定位器反模式。即使这样做,它也违反了IOC的核心原则之一,即依赖应该是明确的。
您的应用程序应该对ObjectFactory.GetInstance()进行少量(甚至是一次)调用,从那时起,所有依赖项都应该作为构造函数参数通过框架处理。
因此,帐户服务的构造函数看起来像:
public AccountService(IAccountRepository accountRepository)
{
//all arguments (not just account repo) would be passed into the ctor
//you also want to check for null for all arguments
_accountRepository = accountRepository;
}
(还要注意,8个参数似乎是这个类有太多责任的标志)
单一帖子真的太过分了,但我建议找一个更好的学习模式和工具的来源。
答案 1 :(得分:0)
StructureMap的作者不鼓励使用XML声明。为什么不用代码声明它,如下所示:
ObjectFactory.Initialize(x =>
{
x.For<ICache>().Use<MemCached>();
x.For<IEmailService>().Use<MailQueue>();
x.For<IUserSession>().Use<UserSession>();
x.For<IRedirector>().Use<Redirector>();
x.For<INavigation>().Use<Navigation>();
});
这样你就不必猜测事情是否正确连线。它的维护和代码也更容易。