在类库项目中使用Unity进行依赖注入

3

我是一名新手,对于依赖注入模式有些困惑。

场景:

我有一个称为“MailCore”的类库项目。该项目具有执行所有电子邮件发送工作的接口和类。 我有一个称为“站点”的MVC项目。它使用“MailCore”项目来发送电子邮件。我在这个项目中使用Unity,并注册了UnityContainer,事情运行得很好。

我还有另一个类库项目称为“SiteRepo”。有时,为了执行特定任务,我必须从该项目发送电子邮件。因此,“MailCore”项目也在该项目中被引用。

问题:

我已经在“SiteRepo”项目中从NuGet安装了Unity,但它似乎并没有在这个类库项目中创建任何UnityConfig。 如何在这里注册UnityContainer?

代码:

TheSite:

Public class JobController : Controller
{
    private readonly IEmailBuilder mailBuilder;
    public JobController(IEmailBuilder mailBuilder)
    {
        this.mailBuilder = mailBuilder;

    }
    public ActionResult Create(....)
    {
      JobRepo j = new JobRepo();
      j.Create(....);
    }

}

UnityConfig(这是Web应用程序“The Site”中的内容):

public static class UnityConfig
{
    public static void RegisterComponents()
    {
        var container = new UnityContainer();

        // register all your components with the container here
        // it is NOT necessary to register your controllers

        // e.g. container.RegisterType<ITestService, TestService>();

        container.RegisterType<IEmailBuilder, EmailBuilder>();

        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
    }
}

SiteRepo:

Public class JobRepo()
{
   Public bool Create(...) 
   {
       //some other code to create a job....

       //have to send email using MailCore !! The problem area in concern..
   }
}

我相信这个问题值得一个更好的答案,而不是使用除了Unity之外的其他东西。 - iGanja
1个回答

6
如果你必须使用像Unity这样的DI容器(而不是Pure DI),你应该将其安装到你的组合根中,也就是'The site'。
从那里,你可以引用库项目并配置你的容器。

由于“站点”引用了这两个库,因此应该可以配置Unity将MailCore中的类型注入到SiteRepo类中托管您关心的方法的类中。 - Mark Seemann
Mark,SiteRepo 有一个叫做 JobRepo 的类,其中有一个名为 CreateJob 的方法。该 CreateJob 方法应调用 MailCore 中的某个内容以发送电子邮件。JobRepo 类没有实现来自 MailCore 的任何接口。在这种情况下,我该如何配置 Unity??难道不是container.RegisterType<interface, implementing class>()吗?? 如果我听起来像个蠢货,那真的很抱歉 :) - Reza.Hoque
据我所知,使用Unity时,您不必注册具体的类; Unity会自动识别并为您创建它们。 - Mark Seemann
如果您对默认设置满意(瞬态生命周期、无名称、无拦截、无属性注入),则不需要注册具体类。但是,如果要自定义注册,则可以注册具体类型。例如:container.RegisterType<MyConcreteType>(new ContainerControlledLifetimeManager()); (注册为单例)。 - TylerOhlsen
1
@AshutoshSingh 在你的测试中组合对象图 https://dev59.com/-XM_5IYBdhLWcg3wPAfT#1465896 - Mark Seemann
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接