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的对象,因为找不到公共构造函数.
拿出来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)
同样,对于您的容器,您可以默认映射。这将自动映射IService到Service:
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)
| 归档时间: |
|
| 查看次数: |
15999 次 |
| 最近记录: |