新建到StructureMap - 没有默认实例错误202

时间:2010-05-20 14:46:19

标签: c# asp.net structuremap

我是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" />

有什么建议吗?感谢。

2 个答案:

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

这样你就不必猜测事情是否正确连线。它的维护和代码也更容易。