Passing Services using Dependency Injection and Factory Pattern in ASP.NET

后端 未结 1 1155
轮回少年
轮回少年 2021-01-02 23:04

I am using ASP.NET Core, I know that such Logging mechanism is already provided by the framework, but using this to illustrate my problem.

I am using kind of Factory

相关标签:
1条回答
  • 2021-01-02 23:24

    There are a couple of errors in your approach:

    • Your services depend on the concrete LoggerFactory type which is a Dependency Inversion Principle violation.
    • Doing this extra initialization can make building the object graph unreliable, while injection constructors should be simple.
    • It hides the fact that the ILogger is the real service that your consumer depends upon. This makes the system harder to test, harder to maintain, and complicates object graph analysis.
    • The use of a factory is a smell, since factories are hardly ever the right solution.

    Instead, your service should look as follows:

    public class MyService
    {
        private ILogger _logger;
        public MyService(ILogger logger)
        {
            _logger = logger;
        }
    }
    

    This dramatically simplifies all consumers that depend upon ILogger. This also means that getting the right ILogger for MyService becomes a responsibility of the Composition Root, which is the correct place to have this knowledge.

    It does mean however that you might need to move away from the built-in DI container of ASP.NET Core to a more feature rich DI library, because the built-in container is not capable of making a context aware registration for ILogger while having the library auto-wire other constructor dependencies as well.

    With the ASP.NET Core DI container, you can only hand-wire your services using a delegate. For instance:

    services.AddTransient<MyService>(c => new MyService(
        BuildLogger(typeof(MyService).Name),
        c.GetRequiredService<ISomeOtherDependency>(),
        c.GetRequiredService<IYetAnotherOne>());
    
    0 讨论(0)
提交回复
热议问题