StructureMap异常:没有为PluginFamily定义默认实例

时间:2010-02-18 01:38:33

标签: structuremap

我在CoreService项目中定义了一个SysMsgManager类,如下所示:

public class SysMsgManager 
{
    private ISysMsgRepository _SysMsgRepository;

    public SysMsgManager()
    {
        _SysMsgRepository = ObjectFactory.GetInstance<ISysMsgRepository>();
    }

    ....
}

在我的DataAccess项目中,我有'ISysMsgRepository'接口和两个具体实现,定义如下:

namespace DataAccess.Repository
{
   [Pluggable("Default")]
   public class SysMsgRepository : ISysMsgRepository
   {
      ...
   }
}

namespace DataAccess.Repository
{
    [Pluggable("Stub")]
    public class SysMsgRepository_Test : ISysMsgRepository
    {
        ...
    }
}

这就是我在StructureMap.config文件中的内容

<StructureMap>

<Assembly Name="CoreService" /> 
<Assembly Name="DataAccess" />

<PluginFamily
    Assembly="DataAccess"
    Type="DataAccess.Repository.ISysMsgRepository"
    DefaultKey="Default" />

</StructureMap>

当我尝试运行我的应用时,出现以下错误:

StructureMap异常代码:202 \ n没有为PluginFamily定义的默认实例DataAccess.Repository.ISysMsgRepository,DataAccess,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null

任何人都可以帮我解决这个问题吗?谢谢!

1 个答案:

答案 0 :(得分:8)

不幸的是,我对通过Xml配置StructureMap知之甚少。让我告诉你如何使用C#完成它。

var container = new Container(config=>
{
  config.For<ISysMsgRepository>().Use<SysMsgRepository>();
});

您似乎正在使用接口和类的标准命名约定(只需将I添加到类名的前面)。如果您为所有类型执行此操作,则可以像这样配置容器:

var container = new Container(config=>
{
    config.Scan(scan =>
    {
        scan.TheCallingAssembly();
        scan.WithDefaultConventions();
    });
});

我希望这会有所帮助。使用代码而不是Xml来配置容器要容易得多。试试看。你将成为一名皈依者。