StructureMap错误:没有为PluginFamily定义默认实例

pat*_*anb 6 c# structuremap asp.net-mvc dependency-injection asp.net-mvc-3

对Structure-Map来说很新.试图弄清楚它是如何工作的,我怎样才能从中受益.

到目前为止我有这个..

的Global.asax.cs:

IContainer container = new Container(x =>
    {
         x.For<IControllerActivator>().Use
              <StructureMapControllerActivator>();
         x.For<IUserRepo>().Use<UserRepo>();
    }); 

DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
Run Code Online (Sandbox Code Playgroud)

StructureMapControllerActivator:

public class StructureMapControllerActivator : IControllerActivator
{
    private readonly IContainer _container;

    public StructureMapControllerActivator(IContainer container )
    {
        this._container = container;
    }

    public IController Create(RequestContext requestContext, Type controllerType)
    {
        return _container.GetInstance(controllerType) as IController;
    }
}
Run Code Online (Sandbox Code Playgroud)

StructreMapDependencyResolver:

private readonly IContainer _container;

    public StructureMapDependencyResolver(IContainer container )
    {
        this._container = container;
    }

    public object GetService(Type serviceType)
    {
        object instance = _container.TryGetInstance(serviceType);
        if(instance == null && !serviceType.IsAbstract)
        {
            _container.Configure(c => c.AddType(serviceType,serviceType));
            instance = _container.TryGetInstance(serviceType);
        }
        return instance;
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return _container.GetAllInstances(serviceType).Cast<object>();
    }
}
Run Code Online (Sandbox Code Playgroud)

我的AccountController:

public class AccountController : Controller
{
    private readonly IUserRepo _userRepo;

    private AccountController()
    {
        _userRepo = ObjectFactory.GetInstance<IUserRepo>();
    }

    public ActionResult Login()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

错误代码和说明:

StructureMap异常代码:202没有为PluginFamily定义的默认实例MBP_Blog.Controllers.AccountController MBP-Blog,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null

我有一个接口名称:IUserRepo和一个存储库名称:UserRepo

请帮助我尝试google但dint在前3页内找到任何解决方案.

使用@ Martin代码后出现新错误:

StructureMap异常代码:180 StructureMap无法构造类MBP_Blog.Controllers.AccountController,MBP-Blog,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null的对象,因为找不到公共构造函数.

Mar*_*tin 3

拿出来StructureMapControllerActivator,我认为你不需要它。如果保留它,则需要为您的AccountController.

另外,使用控制器注入代替,它将使单元测试更容易:

public class AccountController : Controller
{
    private readonly IUserRepo _userRepo;

    public AccountController(IUserRepo userRepo)
    {
        _userRepo = userRepo;
    }

    public ActionResult Login()
    {
        return View();
    }
}
Run Code Online (Sandbox Code Playgroud)

同样,对于您的容器,您可以默认映射。这将自动映射IServiceService

IContainer container = new Container(
            x =>
                {
                    x.Scan(scan =>
                               {
                                   scan.Assembly("MBP_Blog");
                                   scan.Assembly("MBP_Blog.Data");
                                   scan.WithDefaultConventions();
                               });
                });
Run Code Online (Sandbox Code Playgroud)

  • 我认为它应该称为“构造函数注入”而不是“控制器注入” (2认同)