我有一个这样的结构项目: 数据层 - 用于模型 MVC网站 - 与所有其他mvc网站相关。
我希望我的控制器同时注入数据库上下文和服务,并且仍然确保依赖注入。
这是我的代码 我的控制器:
private CMSDB _db;
public HomeController(CMSDB db)
{
_db = db;
}
我的数据库上下文
public class CMSDB : DbContext
{
public CMSDB() : base("DefaultConnection"){ }
public DbSet<Employee> Employees { get; set; }
public DbSet<Department> Departments { get; set; }
public DbSet<UserDatails> Users { get; set; }
public DbSet<UserRole> UserRoles { get; set; }
public DbSet<Module> Modules { get; set; }
}
单独项目中的模型
public class Module : IModule
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
public virtual DateTime? DateCreated { get; set; }
public virtual string ModuleDescription { get; set; }
}
我在与Model
相同的项目中的界面 public interface IModule
{ }
我希望我的控制器能够同时注入CMSDB和IModule,并且仍然确保依赖注入。
重要的因素是能够在以后解决任何其他解决方案(可能是门户网站)。欢迎所有意见。
答案 0 :(得分:1)
确保您正在创建应该在启动时运行的映射
public static class ContainerBootstrapper
{
public static void BootstrapStructureMap()
{
// Initialize the static ObjectFactory container
ObjectFactory.Initialize(x =>
{
x.ForRequestedType<iNTERFACE>().TheDefaultIsConcreteType<ContreteClass>();
});
}
}
然后
iNTERFACE objectINMVCController = ObjectFactory.GetInstance<iNTERFACE>();
答案 1 :(得分:1)
虽然标记为正确答案的答案可行,但由于此特定问题与StructureMap 3有关,因此值得一提的是,不推荐使用StructureMap&#39; ObjectFactory
,因此不推荐使用在版本4中(因为您在尝试构建解决方案时毫无疑问会看到)。
相反,更好的选择是使用StructureMap的IContainer
接口通过以下解决方案构建您的依赖项:
var container = new Container(x => {
x.For<IInterface>().Use<ConcreteClass>();
x.For<IInterface2>().Use<ConcreteClass2>();
});
当你特别提到可重用性时,我建议你看一下StructureMap's Registry classes,它允许你将依赖项封装在一个注册表中,如下所示:
public class WebsiteRegistry : Registry
{
public WebsiteRegistry()
{
For<ICustomerService>().Use<CustomerService>();
For<IProductServer>().Use<ProductService>();
}
}
然后您可以通过以下方式以相同的方式撰写和注册注册表类:
IContainer container = new Container(x =>
{
x.AddRegistry<DatabaseRegistry>();
x.AddRegistry<WebsiteRegistry>();
});
这样做的好处是可以将注册表类分解为核心依赖项,基于网站的依赖项和Web服务依赖项。例如,您的网站和Web服务都需要数据库访问,因此这可能会进入核心注册表,但是您的网站可能需要SessionRegistry
在Web服务中无用(由于Web服务&#39;无会话的性质。)
然后你只需要在Global.asax.cs
类中使用ASP.NET MVC的依赖解析器注册StructureMap。