【问题标题】:New To StructureMap - Getting No Default Instance Error 202StructureMap 的新手 - 没有默认实例错误 202
【发布时间】:2010-05-20 14:46:19
【问题描述】:

我是 StructureMap 的新手,遇到以下错误:

结构图异常代码:202 否 定义的默认实例 插件家族 Company.ProjectCore.Core.IUserSession, Company.ProjectCore,版本=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" />

有什么建议吗?谢谢。

【问题讨论】:

    标签: c# asp.net structuremap


    【解决方案1】:

    乍一看,配置对我来说是正确的。您是在发布的代码运行之前调用 ObjectFactory.Initialize 吗?

    我自己(不再)不使用属性或配置文件,但我认为您不需要同时使用两者。

    另外,您是否有理由首先要使用属性和/或 XML?您可以通过 Fluent 接口使用 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() 的调用很少(或者甚至一个,如果可能的话),并且从那时起,所有依赖项都应该通过框架作为构造函数参数进行处理。

    所以 Account Service 的构造函数看起来像:

    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 个参数很可能表明这个类有太多责任)

    一篇文章真的太多了,但我建议找到更好的资源来学习模式和工具。

    【讨论】:

    • 菲尔,感谢您的回复。我下载了一个可以帮助我启动和运行 SM 的应用程序。我试图对 ObjectFactory.Initialize 进行搜索,但一无所获。何时(何地)应该调用它?再次感谢。
    • 应用程序启动时应该调用它。可能还有其他初始化 SM 的方法,可能比我当前使用的版本更旧或更新。想要发布指向您用作起点的应用的链接?
    • 菲尔 - 再次感谢。我一直在使用 Andrew Siemer 的 ASP.NET 3.5 Social Networking 书遵循 StructureMap 说明。代码可以从他的出版商的网站下载:packtpub.com/code_download/1200 如果您需要其他任何东西,请告诉我。非常感谢您的反馈。
    • 这是一个很大的下载——不确定我是否能得到它(现在正在尝试)。是下载的代码不起作用,还是您创建自己的版本不起作用?
    • 不,下载的代码有效。我直接运行它并编译了他的项目。实际上,我所做的只是更改项目名称并使用 ReSharper 进行修改。现在,当我运行它时,我得到了 202 错误,但对于我的生活,我不知道为什么。我没有对 SM 做任何改变。
    【解决方案2】:

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

    这样您就不必猜测接线是否正确。它也更容易维护,代码更少。

    【讨论】:

    • 迈克尔-谢谢!那效果很好。似乎我正在学习的 SM 架构有点过时了。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2012-12-05
    相关资源
    最近更新 更多