容器的初始化:
public override void Initialize()
{
ObjectFactory.Initialize(x =>
{
x.Scan(s =>
{
s.TheCallingAssembly();
s.AssemblyContainingType<IRegistar>();
s.WithDefaultConventions();
});
});
}
Global.asax.xc
var dependencyContainer = new DependencyContainer();
dependencyContainer.Initialize();
ControllerBuilder.Current.SetControllerFactory(new DependencyControllerFactory());
获取实例:
public class DependencyControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
return base.GetControllerInstance(requestContext, controllerType);
}
try
{
return ObjectFactory.GetInstance(controllerType) as Controller;
}
catch (StructureMapException exception)
{
Debug.WriteLine(ObjectFactory.WhatDoIHave());
throw;
}
}
}
控制器
私人IBabyRepository _babyReposoitory; {
public BabyController(IBabyRepository babyRepository)
{
_babyReposoitory = babyRepository;
}
尝试DI / Ioc的课程
public class BabyRepository : IBabyRepository, IRepository<Baby>, IRegistar
{
Just a Default constructor here();
code...
}
错误:
StructureMap异常代码:202 没有为PluginFamily Domain.Repository.IBabyRepository定义默认实例,Domain,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null
我
我做错了什么?
答案 0 :(得分:0)
您没有告诉StructureMap如何创建BabyRepository。
我认为您的扫描需要是这样的:
Scan(y =>
{
y.AssemblyContainingType<IRegistar>();
y.Assembly(Assembly.GetExecutingAssembly().FullName);
y.With(new RepositoryScanner());
})
然后需要编写自定义RepositoryScanner的代码:
public class RepositoryScanner : IRegistrationConvention
{
public void Process(Type type, Registry registry)
{
if (type.BaseType == null) return;
if (type.GetInterface(typeof(IRepository).Name) != null)
{
var name = type.Name;
registry
.For<IRepository>()
.AddInstances(y => y.Instance(new ConfiguredInstance(type).Named(name)));
}
}
}