Register, Resolve, Release pattern usage










2














I'm currently reading the book Dependency Injection in .NET by Mark Seeman. In this book he recommends the Register, Resolve, Release pattern and also recommends that each of these operations should appear only once in your application's code.



My situation is the following: I'm creating an application that communicates with a PLC (a kind of industrial embedded computer) using a proprietary communication protocol for which the PLC manufacturer provides an library. The library's documentation recommends creating a connection to the PLC and maintaining it open; then using a timer or a while loop, a request should be periodically sent to read the contents of the PLC's memory, which changes over time.



The values read from the PLC's memory should be used to operate on a database, for which I intend to use Entity Framework. As I understand it, the best option is to create a new dbContext on every execution of the loop in order to avoid a stall cache or concurrency problems (the loop could be potentially executing every few milliseconds for a long time while the connection is kept open all the time).



My first option was calling Resolve on application construction to create a long-lived object that would be injected with the PLC communication object and would handle loop execution and keep the connection alive. Then, at the beginning of every loop execution I intended to call Resolve again to create a short-lived object that would be injected with a new dbContext and which would perform the operations on the database. However, after reading the advice on that book I'm doubting whether I'm on the right track.



My first idea was to pass a delegate to the long-lived object upon its construction that would allow it to build new instances of the short-lived object (I believe it is the factory pattern), thus removing the dependency on the DI container from my long-lived object. However, this construct still violates the aforementioned pattern.



Which is the right way of handling Dependency Injection in this situation?



My first attempt without DI:



class NaiveAttempt

private PlcCommunicationObject plcCommunicationObject;
private Timer repeatedExecutionTimer;

public NaiveAttempt()

plcCommunicationObject = new PlcCommunicationObject("192.168.0.10");
plcCommunicationObject.Connect();

repeatedExecutionTimer = new Timer(100); //Read values from PLC every 100ms
repeatedExecutionTimer.Elapsed += (_, __) =>

var memoryContents = plcCommunicationObject.ReadMemoryContents();
using (var ctx = new DbContext())

// Operate upon database
ctx.SaveChanges();






Second attempt using Poor man's DI.



class OneLoopObject

private PlcCommunicationObject plcCommunicationObject;
private Func<DbContext> dbContextFactory;

public OneLoopObject(PlcCommunicationObject plcCommunicationObject, DbContext dbContext

this.plcCommunicationObject = plcCommunicationObject;
this.dbContext = dbContext;


public void Execute()

var memoryContents = plcCommunicationObject.ReadMemoryContents();
// Operate upon database



class LongLivedObject

private PlcCommunicationObject plcCommunicationObject;
private Timer repeatedExecutionTimer;
private Func<OneLoopObject> oneLoopObjectFactory;

public LongLivedObject(PlcCommunicationObject plcCommunicationObject, Func<PlcCommunicationObject, OneLoopObject> oneLoopObjectFactory)

this.plcCommunicationObject = plcCommunicationObject;
this.dbContextFactory = dbContextFactory;
this repeatedExecutionTimer = new Timer(100);
this.repeatedExecutionTimer.Elapsed += (_, __) =>

var loopObject = oneLoopObjectFactory(plcCommunicationObject);
loopObject.Execute();




static class Program

static void Main()

Func<PlcCommunicationObject, OneLoopObject> oneLoopObjectFactory = plc => new OneLoopObject(plc, new DbContext());
var myObject = LongLivedObject(new PlcCommunicationObject("192.168.1.1"), oneLoopObjectFactory)

Console.ReadLine();











share|improve this question




























    2














    I'm currently reading the book Dependency Injection in .NET by Mark Seeman. In this book he recommends the Register, Resolve, Release pattern and also recommends that each of these operations should appear only once in your application's code.



    My situation is the following: I'm creating an application that communicates with a PLC (a kind of industrial embedded computer) using a proprietary communication protocol for which the PLC manufacturer provides an library. The library's documentation recommends creating a connection to the PLC and maintaining it open; then using a timer or a while loop, a request should be periodically sent to read the contents of the PLC's memory, which changes over time.



    The values read from the PLC's memory should be used to operate on a database, for which I intend to use Entity Framework. As I understand it, the best option is to create a new dbContext on every execution of the loop in order to avoid a stall cache or concurrency problems (the loop could be potentially executing every few milliseconds for a long time while the connection is kept open all the time).



    My first option was calling Resolve on application construction to create a long-lived object that would be injected with the PLC communication object and would handle loop execution and keep the connection alive. Then, at the beginning of every loop execution I intended to call Resolve again to create a short-lived object that would be injected with a new dbContext and which would perform the operations on the database. However, after reading the advice on that book I'm doubting whether I'm on the right track.



    My first idea was to pass a delegate to the long-lived object upon its construction that would allow it to build new instances of the short-lived object (I believe it is the factory pattern), thus removing the dependency on the DI container from my long-lived object. However, this construct still violates the aforementioned pattern.



    Which is the right way of handling Dependency Injection in this situation?



    My first attempt without DI:



    class NaiveAttempt

    private PlcCommunicationObject plcCommunicationObject;
    private Timer repeatedExecutionTimer;

    public NaiveAttempt()

    plcCommunicationObject = new PlcCommunicationObject("192.168.0.10");
    plcCommunicationObject.Connect();

    repeatedExecutionTimer = new Timer(100); //Read values from PLC every 100ms
    repeatedExecutionTimer.Elapsed += (_, __) =>

    var memoryContents = plcCommunicationObject.ReadMemoryContents();
    using (var ctx = new DbContext())

    // Operate upon database
    ctx.SaveChanges();






    Second attempt using Poor man's DI.



    class OneLoopObject

    private PlcCommunicationObject plcCommunicationObject;
    private Func<DbContext> dbContextFactory;

    public OneLoopObject(PlcCommunicationObject plcCommunicationObject, DbContext dbContext

    this.plcCommunicationObject = plcCommunicationObject;
    this.dbContext = dbContext;


    public void Execute()

    var memoryContents = plcCommunicationObject.ReadMemoryContents();
    // Operate upon database



    class LongLivedObject

    private PlcCommunicationObject plcCommunicationObject;
    private Timer repeatedExecutionTimer;
    private Func<OneLoopObject> oneLoopObjectFactory;

    public LongLivedObject(PlcCommunicationObject plcCommunicationObject, Func<PlcCommunicationObject, OneLoopObject> oneLoopObjectFactory)

    this.plcCommunicationObject = plcCommunicationObject;
    this.dbContextFactory = dbContextFactory;
    this repeatedExecutionTimer = new Timer(100);
    this.repeatedExecutionTimer.Elapsed += (_, __) =>

    var loopObject = oneLoopObjectFactory(plcCommunicationObject);
    loopObject.Execute();




    static class Program

    static void Main()

    Func<PlcCommunicationObject, OneLoopObject> oneLoopObjectFactory = plc => new OneLoopObject(plc, new DbContext());
    var myObject = LongLivedObject(new PlcCommunicationObject("192.168.1.1"), oneLoopObjectFactory)

    Console.ReadLine();











    share|improve this question


























      2












      2








      2







      I'm currently reading the book Dependency Injection in .NET by Mark Seeman. In this book he recommends the Register, Resolve, Release pattern and also recommends that each of these operations should appear only once in your application's code.



      My situation is the following: I'm creating an application that communicates with a PLC (a kind of industrial embedded computer) using a proprietary communication protocol for which the PLC manufacturer provides an library. The library's documentation recommends creating a connection to the PLC and maintaining it open; then using a timer or a while loop, a request should be periodically sent to read the contents of the PLC's memory, which changes over time.



      The values read from the PLC's memory should be used to operate on a database, for which I intend to use Entity Framework. As I understand it, the best option is to create a new dbContext on every execution of the loop in order to avoid a stall cache or concurrency problems (the loop could be potentially executing every few milliseconds for a long time while the connection is kept open all the time).



      My first option was calling Resolve on application construction to create a long-lived object that would be injected with the PLC communication object and would handle loop execution and keep the connection alive. Then, at the beginning of every loop execution I intended to call Resolve again to create a short-lived object that would be injected with a new dbContext and which would perform the operations on the database. However, after reading the advice on that book I'm doubting whether I'm on the right track.



      My first idea was to pass a delegate to the long-lived object upon its construction that would allow it to build new instances of the short-lived object (I believe it is the factory pattern), thus removing the dependency on the DI container from my long-lived object. However, this construct still violates the aforementioned pattern.



      Which is the right way of handling Dependency Injection in this situation?



      My first attempt without DI:



      class NaiveAttempt

      private PlcCommunicationObject plcCommunicationObject;
      private Timer repeatedExecutionTimer;

      public NaiveAttempt()

      plcCommunicationObject = new PlcCommunicationObject("192.168.0.10");
      plcCommunicationObject.Connect();

      repeatedExecutionTimer = new Timer(100); //Read values from PLC every 100ms
      repeatedExecutionTimer.Elapsed += (_, __) =>

      var memoryContents = plcCommunicationObject.ReadMemoryContents();
      using (var ctx = new DbContext())

      // Operate upon database
      ctx.SaveChanges();






      Second attempt using Poor man's DI.



      class OneLoopObject

      private PlcCommunicationObject plcCommunicationObject;
      private Func<DbContext> dbContextFactory;

      public OneLoopObject(PlcCommunicationObject plcCommunicationObject, DbContext dbContext

      this.plcCommunicationObject = plcCommunicationObject;
      this.dbContext = dbContext;


      public void Execute()

      var memoryContents = plcCommunicationObject.ReadMemoryContents();
      // Operate upon database



      class LongLivedObject

      private PlcCommunicationObject plcCommunicationObject;
      private Timer repeatedExecutionTimer;
      private Func<OneLoopObject> oneLoopObjectFactory;

      public LongLivedObject(PlcCommunicationObject plcCommunicationObject, Func<PlcCommunicationObject, OneLoopObject> oneLoopObjectFactory)

      this.plcCommunicationObject = plcCommunicationObject;
      this.dbContextFactory = dbContextFactory;
      this repeatedExecutionTimer = new Timer(100);
      this.repeatedExecutionTimer.Elapsed += (_, __) =>

      var loopObject = oneLoopObjectFactory(plcCommunicationObject);
      loopObject.Execute();




      static class Program

      static void Main()

      Func<PlcCommunicationObject, OneLoopObject> oneLoopObjectFactory = plc => new OneLoopObject(plc, new DbContext());
      var myObject = LongLivedObject(new PlcCommunicationObject("192.168.1.1"), oneLoopObjectFactory)

      Console.ReadLine();











      share|improve this question















      I'm currently reading the book Dependency Injection in .NET by Mark Seeman. In this book he recommends the Register, Resolve, Release pattern and also recommends that each of these operations should appear only once in your application's code.



      My situation is the following: I'm creating an application that communicates with a PLC (a kind of industrial embedded computer) using a proprietary communication protocol for which the PLC manufacturer provides an library. The library's documentation recommends creating a connection to the PLC and maintaining it open; then using a timer or a while loop, a request should be periodically sent to read the contents of the PLC's memory, which changes over time.



      The values read from the PLC's memory should be used to operate on a database, for which I intend to use Entity Framework. As I understand it, the best option is to create a new dbContext on every execution of the loop in order to avoid a stall cache or concurrency problems (the loop could be potentially executing every few milliseconds for a long time while the connection is kept open all the time).



      My first option was calling Resolve on application construction to create a long-lived object that would be injected with the PLC communication object and would handle loop execution and keep the connection alive. Then, at the beginning of every loop execution I intended to call Resolve again to create a short-lived object that would be injected with a new dbContext and which would perform the operations on the database. However, after reading the advice on that book I'm doubting whether I'm on the right track.



      My first idea was to pass a delegate to the long-lived object upon its construction that would allow it to build new instances of the short-lived object (I believe it is the factory pattern), thus removing the dependency on the DI container from my long-lived object. However, this construct still violates the aforementioned pattern.



      Which is the right way of handling Dependency Injection in this situation?



      My first attempt without DI:



      class NaiveAttempt

      private PlcCommunicationObject plcCommunicationObject;
      private Timer repeatedExecutionTimer;

      public NaiveAttempt()

      plcCommunicationObject = new PlcCommunicationObject("192.168.0.10");
      plcCommunicationObject.Connect();

      repeatedExecutionTimer = new Timer(100); //Read values from PLC every 100ms
      repeatedExecutionTimer.Elapsed += (_, __) =>

      var memoryContents = plcCommunicationObject.ReadMemoryContents();
      using (var ctx = new DbContext())

      // Operate upon database
      ctx.SaveChanges();






      Second attempt using Poor man's DI.



      class OneLoopObject

      private PlcCommunicationObject plcCommunicationObject;
      private Func<DbContext> dbContextFactory;

      public OneLoopObject(PlcCommunicationObject plcCommunicationObject, DbContext dbContext

      this.plcCommunicationObject = plcCommunicationObject;
      this.dbContext = dbContext;


      public void Execute()

      var memoryContents = plcCommunicationObject.ReadMemoryContents();
      // Operate upon database



      class LongLivedObject

      private PlcCommunicationObject plcCommunicationObject;
      private Timer repeatedExecutionTimer;
      private Func<OneLoopObject> oneLoopObjectFactory;

      public LongLivedObject(PlcCommunicationObject plcCommunicationObject, Func<PlcCommunicationObject, OneLoopObject> oneLoopObjectFactory)

      this.plcCommunicationObject = plcCommunicationObject;
      this.dbContextFactory = dbContextFactory;
      this repeatedExecutionTimer = new Timer(100);
      this.repeatedExecutionTimer.Elapsed += (_, __) =>

      var loopObject = oneLoopObjectFactory(plcCommunicationObject);
      loopObject.Execute();




      static class Program

      static void Main()

      Func<PlcCommunicationObject, OneLoopObject> oneLoopObjectFactory = plc => new OneLoopObject(plc, new DbContext());
      var myObject = LongLivedObject(new PlcCommunicationObject("192.168.1.1"), oneLoopObjectFactory)

      Console.ReadLine();








      c# design-patterns dependency-injection






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 12 at 20:22









      Erik Philips

      40k689123




      40k689123










      asked Nov 12 at 18:48









      Jordi

      296210




      296210






















          4 Answers
          4






          active

          oldest

          votes


















          1














          The first edition states (chapter 3, page 82):




          In its pure form, the Register Resolve Release pattern states that you should only make a single method call in each phase [...] an application should only contain a single call to the Resolve method.




          This description stems from the idea that your application only contains either one root object (typically when writing a simple console application), or one single logical group of root types, e.g. MVC controllers. With MVC controllers, for instance, you would have a custom Controller Factory, which is provided by the MVC framework with a controller type to build. That factory will, in that case, only have a single call to Resolve while supplying the type.



          There are cases, however, where your application has multiple groups of root types. For instance, a web application could have a mix of API Controllers, MVC Controllers and View Components. For each logical group you would likely have a single call to Resolve, and thus multiple calls to Resolve (typically because each root type gets its own factory) in your application.



          There are other valid reasons for calling back into the container. For instance, you might want to defer building part of the object graph, to combat the issue of Captive Dependencies. This seems your case. Another reason for having an extra resolve is when you use the Mediator pattern to dispatch messages to a certain implementation (or implementations) that can handle that message. In that case your Mediator implementation would typically wrap the container and call Resolve. The Mediator’s abstraction would likely be defined in your Domain library, while the Mediator’s implementation, with its knowledge of the container, should be defined inside the Composition Root.



          The advice of having a single call to Resolve should, therefore, not be taken literally. The actual goal here is to build a single object graph as much as possible in one call, compared to letting classes themselves call back into the container to resolve their dependencies (i.e. the Service Locator anti-pattern).



          The other important point that (the second edition of) the book makes is




          Querying for Dependencies, even if through a DI Container, becomes a Service Locator if used incorrectly. When application code (as opposed to infrastructure code) actively queries a service in order to be provided with required Dependencies, then it has become a Service Locator.



          A DI Container encapsulated in a Composition Root isn't a Service Locator—it's an infrastructure component.




          (note: this quote is from the second edition; Although the first edition contains this information as well, it might be formulated differently).



          So the goal of the RRR pattern is to promote encapsulation of the DI Container within the Composition Root, which is why it insists in having a single call to Resolve.



          Do note that while writing the second edition, Mark and I wanted to rewrite the discussion of the RRR pattern. Main reason for this was that we found the text to be confusing (as your question indicates). However, we eventually ran out of time so we decided to simply remove that elaborate discussion. We felt that the most important points were already made.






          share|improve this answer






























            1














            Combining factories with DI is a common solution. There is absolutely nothing wrong with creating and disposing objects dynamically in your program (it's much more difficult and limiting to try to account for every bit of memory you'll need up front).



            I found a post by Mark Seeman about the Register, Resolve, Release Pattern (RRR) here: http://blog.ploeh.dk/2010/09/29/TheRegisterResolveReleasepattern/



            He states that...




            The names originate with Castle Windsor terminology, where we:



            Register components with the container



            Resolve root components



            Release components from the container




            So the RRR pattern is limited to the DI Container. You do indeed Register and Release components with the container one time in your application. This says nothing about objects not injected through DI, ie those objects created dynamically in the normal execution of your program.



            I have seen various articles use distinct terminology for the two different types of things you create in your program with relation to DI. There are Service Objects, ie those global objects injected via DI to your application. Then there are Data or Value Objects. These are created by your program dynamically as needed and are generally limited to some local scope. Both are perfectly valid.






            share|improve this answer






















            • I think that the problem that I'm facing and I don't know how to solve is as simple as that: I have two Service Objects, one that must be long-lived and another one that must be short-lived. My intention was to use the DI container to create both, but that would mean two Resolve calls. How is this best achieved?
              – Jordi
              Nov 12 at 20:03






            • 1




              Inject a factory for the short-lived object
              – Ryan Pierce Williams
              Nov 12 at 20:22


















            1














            It sounds like you want to be able to both resolve objects from the container and then release them, all without directly referencing the container.



            You can do that by having both a Create and a Release method in your factory interface.



            public interface IFooFactory

            Foo Create();
            void Release(Foo created);



            This allows you to hide references to the container within the implementation of IFooFactory.



            You can create your own factory implementation, but for convenience some containers, like Windsor, will create the factory implementation for you.



            var container = new WindsorContainer();
            container.AddFacility<TypedFactoryFacility>();
            container.Register(Component.For<Foo>());
            container.Register(
            Component.For<IFooFactory>()
            .AsFactory()
            );


            You can inject the factory, call Create to obtain an instance of whatever the factory creates, and when you're done with it, pass that instance to the Release method.



            Windsor does this by convention. The method names don't matter. If you call a method of the interface that returns something, it attempts to resolve it. If a method returns void and takes an argument then it tries to release the argument from the container.



            Behind the scenes it's roughly the same as if you wrote this:



            public class WindsorFooFactory : IFooFactory

            private readonly IWindsorContainer _container;

            public WindsorFooFactory(IWindsorContainer container)

            _container = container;


            public Foo Create()

            return _container.Resolve<Foo>();


            public void Release(Foo created)

            _container.Release(created);




            The factory implementation "knows" about the container, but that's okay. Its job is to create objects. The factory interface doesn't mention the container, so classes that depend on the interface aren't coupled to the container. You could create an entirely different implementation of the factory that doesn't use a container. If the object didn't need to be released you could have a Release method that does nothing.



            So, in a nutshell, the factory interface is what enables you to follow the resolve/release part of the pattern without directly depending on the container.



            Here's another example that shows a little bit more of what you can do with these abstract factories.






            share|improve this answer






















            • Mark Seeman has written a bunch of articles about Windsor, and it's a popular container, but for some reason it's not one of the containers he talks about in his book. He mentions Autofac, which does something similar with delegate factories, and it depends on the scope to ensure that what is resolved gets released.
              – Scott Hannen
              Nov 12 at 20:35










            • As a matter of fact, Castle Windsor is discussed thoroughly in the first edition. In the second edition, however, we decided to remove the discussion of Castle Windsor (and other containers).
              – Steven
              Nov 13 at 16:00










            • @Steven I only have the first edition. I did not realize that the second audition had two co-authors. My future references will cite the authors correctly. Thank you!
              – Scott Hannen
              Nov 13 at 16:36


















            1














            Autofac uses Func<> as the factory pattern so you could always do the same:



            public class Foo()

            private readonly Func<Bar> _barFactory;

            public Foo(Func<Bar> barFactory)

            _barFactory = barFactory;




            Adding Factory Interfaces for factories is not something I think anyone should need to do most of the time, it's extra work for little to no reward.



            Then you simply need to keep track of which entities are externally owned or DI owned for your release (Dispose in C#).






            share|improve this answer




















              Your Answer






              StackExchange.ifUsing("editor", function ()
              StackExchange.using("externalEditor", function ()
              StackExchange.using("snippets", function ()
              StackExchange.snippets.init();
              );
              );
              , "code-snippets");

              StackExchange.ready(function()
              var channelOptions =
              tags: "".split(" "),
              id: "1"
              ;
              initTagRenderer("".split(" "), "".split(" "), channelOptions);

              StackExchange.using("externalEditor", function()
              // Have to fire editor after snippets, if snippets enabled
              if (StackExchange.settings.snippets.snippetsEnabled)
              StackExchange.using("snippets", function()
              createEditor();
              );

              else
              createEditor();

              );

              function createEditor()
              StackExchange.prepareEditor(
              heartbeatType: 'answer',
              autoActivateHeartbeat: false,
              convertImagesToLinks: true,
              noModals: true,
              showLowRepImageUploadWarning: true,
              reputationToPostImages: 10,
              bindNavPrevention: true,
              postfix: "",
              imageUploader:
              brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
              contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
              allowUrls: true
              ,
              onDemand: true,
              discardSelector: ".discard-answer"
              ,immediatelyShowMarkdownHelp:true
              );



              );













              draft saved

              draft discarded


















              StackExchange.ready(
              function ()
              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53268326%2fregister-resolve-release-pattern-usage%23new-answer', 'question_page');

              );

              Post as a guest















              Required, but never shown

























              4 Answers
              4






              active

              oldest

              votes








              4 Answers
              4






              active

              oldest

              votes









              active

              oldest

              votes






              active

              oldest

              votes









              1














              The first edition states (chapter 3, page 82):




              In its pure form, the Register Resolve Release pattern states that you should only make a single method call in each phase [...] an application should only contain a single call to the Resolve method.




              This description stems from the idea that your application only contains either one root object (typically when writing a simple console application), or one single logical group of root types, e.g. MVC controllers. With MVC controllers, for instance, you would have a custom Controller Factory, which is provided by the MVC framework with a controller type to build. That factory will, in that case, only have a single call to Resolve while supplying the type.



              There are cases, however, where your application has multiple groups of root types. For instance, a web application could have a mix of API Controllers, MVC Controllers and View Components. For each logical group you would likely have a single call to Resolve, and thus multiple calls to Resolve (typically because each root type gets its own factory) in your application.



              There are other valid reasons for calling back into the container. For instance, you might want to defer building part of the object graph, to combat the issue of Captive Dependencies. This seems your case. Another reason for having an extra resolve is when you use the Mediator pattern to dispatch messages to a certain implementation (or implementations) that can handle that message. In that case your Mediator implementation would typically wrap the container and call Resolve. The Mediator’s abstraction would likely be defined in your Domain library, while the Mediator’s implementation, with its knowledge of the container, should be defined inside the Composition Root.



              The advice of having a single call to Resolve should, therefore, not be taken literally. The actual goal here is to build a single object graph as much as possible in one call, compared to letting classes themselves call back into the container to resolve their dependencies (i.e. the Service Locator anti-pattern).



              The other important point that (the second edition of) the book makes is




              Querying for Dependencies, even if through a DI Container, becomes a Service Locator if used incorrectly. When application code (as opposed to infrastructure code) actively queries a service in order to be provided with required Dependencies, then it has become a Service Locator.



              A DI Container encapsulated in a Composition Root isn't a Service Locator—it's an infrastructure component.




              (note: this quote is from the second edition; Although the first edition contains this information as well, it might be formulated differently).



              So the goal of the RRR pattern is to promote encapsulation of the DI Container within the Composition Root, which is why it insists in having a single call to Resolve.



              Do note that while writing the second edition, Mark and I wanted to rewrite the discussion of the RRR pattern. Main reason for this was that we found the text to be confusing (as your question indicates). However, we eventually ran out of time so we decided to simply remove that elaborate discussion. We felt that the most important points were already made.






              share|improve this answer



























                1














                The first edition states (chapter 3, page 82):




                In its pure form, the Register Resolve Release pattern states that you should only make a single method call in each phase [...] an application should only contain a single call to the Resolve method.




                This description stems from the idea that your application only contains either one root object (typically when writing a simple console application), or one single logical group of root types, e.g. MVC controllers. With MVC controllers, for instance, you would have a custom Controller Factory, which is provided by the MVC framework with a controller type to build. That factory will, in that case, only have a single call to Resolve while supplying the type.



                There are cases, however, where your application has multiple groups of root types. For instance, a web application could have a mix of API Controllers, MVC Controllers and View Components. For each logical group you would likely have a single call to Resolve, and thus multiple calls to Resolve (typically because each root type gets its own factory) in your application.



                There are other valid reasons for calling back into the container. For instance, you might want to defer building part of the object graph, to combat the issue of Captive Dependencies. This seems your case. Another reason for having an extra resolve is when you use the Mediator pattern to dispatch messages to a certain implementation (or implementations) that can handle that message. In that case your Mediator implementation would typically wrap the container and call Resolve. The Mediator’s abstraction would likely be defined in your Domain library, while the Mediator’s implementation, with its knowledge of the container, should be defined inside the Composition Root.



                The advice of having a single call to Resolve should, therefore, not be taken literally. The actual goal here is to build a single object graph as much as possible in one call, compared to letting classes themselves call back into the container to resolve their dependencies (i.e. the Service Locator anti-pattern).



                The other important point that (the second edition of) the book makes is




                Querying for Dependencies, even if through a DI Container, becomes a Service Locator if used incorrectly. When application code (as opposed to infrastructure code) actively queries a service in order to be provided with required Dependencies, then it has become a Service Locator.



                A DI Container encapsulated in a Composition Root isn't a Service Locator—it's an infrastructure component.




                (note: this quote is from the second edition; Although the first edition contains this information as well, it might be formulated differently).



                So the goal of the RRR pattern is to promote encapsulation of the DI Container within the Composition Root, which is why it insists in having a single call to Resolve.



                Do note that while writing the second edition, Mark and I wanted to rewrite the discussion of the RRR pattern. Main reason for this was that we found the text to be confusing (as your question indicates). However, we eventually ran out of time so we decided to simply remove that elaborate discussion. We felt that the most important points were already made.






                share|improve this answer

























                  1












                  1








                  1






                  The first edition states (chapter 3, page 82):




                  In its pure form, the Register Resolve Release pattern states that you should only make a single method call in each phase [...] an application should only contain a single call to the Resolve method.




                  This description stems from the idea that your application only contains either one root object (typically when writing a simple console application), or one single logical group of root types, e.g. MVC controllers. With MVC controllers, for instance, you would have a custom Controller Factory, which is provided by the MVC framework with a controller type to build. That factory will, in that case, only have a single call to Resolve while supplying the type.



                  There are cases, however, where your application has multiple groups of root types. For instance, a web application could have a mix of API Controllers, MVC Controllers and View Components. For each logical group you would likely have a single call to Resolve, and thus multiple calls to Resolve (typically because each root type gets its own factory) in your application.



                  There are other valid reasons for calling back into the container. For instance, you might want to defer building part of the object graph, to combat the issue of Captive Dependencies. This seems your case. Another reason for having an extra resolve is when you use the Mediator pattern to dispatch messages to a certain implementation (or implementations) that can handle that message. In that case your Mediator implementation would typically wrap the container and call Resolve. The Mediator’s abstraction would likely be defined in your Domain library, while the Mediator’s implementation, with its knowledge of the container, should be defined inside the Composition Root.



                  The advice of having a single call to Resolve should, therefore, not be taken literally. The actual goal here is to build a single object graph as much as possible in one call, compared to letting classes themselves call back into the container to resolve their dependencies (i.e. the Service Locator anti-pattern).



                  The other important point that (the second edition of) the book makes is




                  Querying for Dependencies, even if through a DI Container, becomes a Service Locator if used incorrectly. When application code (as opposed to infrastructure code) actively queries a service in order to be provided with required Dependencies, then it has become a Service Locator.



                  A DI Container encapsulated in a Composition Root isn't a Service Locator—it's an infrastructure component.




                  (note: this quote is from the second edition; Although the first edition contains this information as well, it might be formulated differently).



                  So the goal of the RRR pattern is to promote encapsulation of the DI Container within the Composition Root, which is why it insists in having a single call to Resolve.



                  Do note that while writing the second edition, Mark and I wanted to rewrite the discussion of the RRR pattern. Main reason for this was that we found the text to be confusing (as your question indicates). However, we eventually ran out of time so we decided to simply remove that elaborate discussion. We felt that the most important points were already made.






                  share|improve this answer














                  The first edition states (chapter 3, page 82):




                  In its pure form, the Register Resolve Release pattern states that you should only make a single method call in each phase [...] an application should only contain a single call to the Resolve method.




                  This description stems from the idea that your application only contains either one root object (typically when writing a simple console application), or one single logical group of root types, e.g. MVC controllers. With MVC controllers, for instance, you would have a custom Controller Factory, which is provided by the MVC framework with a controller type to build. That factory will, in that case, only have a single call to Resolve while supplying the type.



                  There are cases, however, where your application has multiple groups of root types. For instance, a web application could have a mix of API Controllers, MVC Controllers and View Components. For each logical group you would likely have a single call to Resolve, and thus multiple calls to Resolve (typically because each root type gets its own factory) in your application.



                  There are other valid reasons for calling back into the container. For instance, you might want to defer building part of the object graph, to combat the issue of Captive Dependencies. This seems your case. Another reason for having an extra resolve is when you use the Mediator pattern to dispatch messages to a certain implementation (or implementations) that can handle that message. In that case your Mediator implementation would typically wrap the container and call Resolve. The Mediator’s abstraction would likely be defined in your Domain library, while the Mediator’s implementation, with its knowledge of the container, should be defined inside the Composition Root.



                  The advice of having a single call to Resolve should, therefore, not be taken literally. The actual goal here is to build a single object graph as much as possible in one call, compared to letting classes themselves call back into the container to resolve their dependencies (i.e. the Service Locator anti-pattern).



                  The other important point that (the second edition of) the book makes is




                  Querying for Dependencies, even if through a DI Container, becomes a Service Locator if used incorrectly. When application code (as opposed to infrastructure code) actively queries a service in order to be provided with required Dependencies, then it has become a Service Locator.



                  A DI Container encapsulated in a Composition Root isn't a Service Locator—it's an infrastructure component.




                  (note: this quote is from the second edition; Although the first edition contains this information as well, it might be formulated differently).



                  So the goal of the RRR pattern is to promote encapsulation of the DI Container within the Composition Root, which is why it insists in having a single call to Resolve.



                  Do note that while writing the second edition, Mark and I wanted to rewrite the discussion of the RRR pattern. Main reason for this was that we found the text to be confusing (as your question indicates). However, we eventually ran out of time so we decided to simply remove that elaborate discussion. We felt that the most important points were already made.







                  share|improve this answer














                  share|improve this answer



                  share|improve this answer








                  edited Nov 13 at 15:53

























                  answered Nov 13 at 10:52









                  Steven

                  126k17212330




                  126k17212330























                      1














                      Combining factories with DI is a common solution. There is absolutely nothing wrong with creating and disposing objects dynamically in your program (it's much more difficult and limiting to try to account for every bit of memory you'll need up front).



                      I found a post by Mark Seeman about the Register, Resolve, Release Pattern (RRR) here: http://blog.ploeh.dk/2010/09/29/TheRegisterResolveReleasepattern/



                      He states that...




                      The names originate with Castle Windsor terminology, where we:



                      Register components with the container



                      Resolve root components



                      Release components from the container




                      So the RRR pattern is limited to the DI Container. You do indeed Register and Release components with the container one time in your application. This says nothing about objects not injected through DI, ie those objects created dynamically in the normal execution of your program.



                      I have seen various articles use distinct terminology for the two different types of things you create in your program with relation to DI. There are Service Objects, ie those global objects injected via DI to your application. Then there are Data or Value Objects. These are created by your program dynamically as needed and are generally limited to some local scope. Both are perfectly valid.






                      share|improve this answer






















                      • I think that the problem that I'm facing and I don't know how to solve is as simple as that: I have two Service Objects, one that must be long-lived and another one that must be short-lived. My intention was to use the DI container to create both, but that would mean two Resolve calls. How is this best achieved?
                        – Jordi
                        Nov 12 at 20:03






                      • 1




                        Inject a factory for the short-lived object
                        – Ryan Pierce Williams
                        Nov 12 at 20:22















                      1














                      Combining factories with DI is a common solution. There is absolutely nothing wrong with creating and disposing objects dynamically in your program (it's much more difficult and limiting to try to account for every bit of memory you'll need up front).



                      I found a post by Mark Seeman about the Register, Resolve, Release Pattern (RRR) here: http://blog.ploeh.dk/2010/09/29/TheRegisterResolveReleasepattern/



                      He states that...




                      The names originate with Castle Windsor terminology, where we:



                      Register components with the container



                      Resolve root components



                      Release components from the container




                      So the RRR pattern is limited to the DI Container. You do indeed Register and Release components with the container one time in your application. This says nothing about objects not injected through DI, ie those objects created dynamically in the normal execution of your program.



                      I have seen various articles use distinct terminology for the two different types of things you create in your program with relation to DI. There are Service Objects, ie those global objects injected via DI to your application. Then there are Data or Value Objects. These are created by your program dynamically as needed and are generally limited to some local scope. Both are perfectly valid.






                      share|improve this answer






















                      • I think that the problem that I'm facing and I don't know how to solve is as simple as that: I have two Service Objects, one that must be long-lived and another one that must be short-lived. My intention was to use the DI container to create both, but that would mean two Resolve calls. How is this best achieved?
                        – Jordi
                        Nov 12 at 20:03






                      • 1




                        Inject a factory for the short-lived object
                        – Ryan Pierce Williams
                        Nov 12 at 20:22













                      1












                      1








                      1






                      Combining factories with DI is a common solution. There is absolutely nothing wrong with creating and disposing objects dynamically in your program (it's much more difficult and limiting to try to account for every bit of memory you'll need up front).



                      I found a post by Mark Seeman about the Register, Resolve, Release Pattern (RRR) here: http://blog.ploeh.dk/2010/09/29/TheRegisterResolveReleasepattern/



                      He states that...




                      The names originate with Castle Windsor terminology, where we:



                      Register components with the container



                      Resolve root components



                      Release components from the container




                      So the RRR pattern is limited to the DI Container. You do indeed Register and Release components with the container one time in your application. This says nothing about objects not injected through DI, ie those objects created dynamically in the normal execution of your program.



                      I have seen various articles use distinct terminology for the two different types of things you create in your program with relation to DI. There are Service Objects, ie those global objects injected via DI to your application. Then there are Data or Value Objects. These are created by your program dynamically as needed and are generally limited to some local scope. Both are perfectly valid.






                      share|improve this answer














                      Combining factories with DI is a common solution. There is absolutely nothing wrong with creating and disposing objects dynamically in your program (it's much more difficult and limiting to try to account for every bit of memory you'll need up front).



                      I found a post by Mark Seeman about the Register, Resolve, Release Pattern (RRR) here: http://blog.ploeh.dk/2010/09/29/TheRegisterResolveReleasepattern/



                      He states that...




                      The names originate with Castle Windsor terminology, where we:



                      Register components with the container



                      Resolve root components



                      Release components from the container




                      So the RRR pattern is limited to the DI Container. You do indeed Register and Release components with the container one time in your application. This says nothing about objects not injected through DI, ie those objects created dynamically in the normal execution of your program.



                      I have seen various articles use distinct terminology for the two different types of things you create in your program with relation to DI. There are Service Objects, ie those global objects injected via DI to your application. Then there are Data or Value Objects. These are created by your program dynamically as needed and are generally limited to some local scope. Both are perfectly valid.







                      share|improve this answer














                      share|improve this answer



                      share|improve this answer








                      edited Nov 12 at 19:47

























                      answered Nov 12 at 19:18









                      Ryan Pierce Williams

                      43719




                      43719











                      • I think that the problem that I'm facing and I don't know how to solve is as simple as that: I have two Service Objects, one that must be long-lived and another one that must be short-lived. My intention was to use the DI container to create both, but that would mean two Resolve calls. How is this best achieved?
                        – Jordi
                        Nov 12 at 20:03






                      • 1




                        Inject a factory for the short-lived object
                        – Ryan Pierce Williams
                        Nov 12 at 20:22
















                      • I think that the problem that I'm facing and I don't know how to solve is as simple as that: I have two Service Objects, one that must be long-lived and another one that must be short-lived. My intention was to use the DI container to create both, but that would mean two Resolve calls. How is this best achieved?
                        – Jordi
                        Nov 12 at 20:03






                      • 1




                        Inject a factory for the short-lived object
                        – Ryan Pierce Williams
                        Nov 12 at 20:22















                      I think that the problem that I'm facing and I don't know how to solve is as simple as that: I have two Service Objects, one that must be long-lived and another one that must be short-lived. My intention was to use the DI container to create both, but that would mean two Resolve calls. How is this best achieved?
                      – Jordi
                      Nov 12 at 20:03




                      I think that the problem that I'm facing and I don't know how to solve is as simple as that: I have two Service Objects, one that must be long-lived and another one that must be short-lived. My intention was to use the DI container to create both, but that would mean two Resolve calls. How is this best achieved?
                      – Jordi
                      Nov 12 at 20:03




                      1




                      1




                      Inject a factory for the short-lived object
                      – Ryan Pierce Williams
                      Nov 12 at 20:22




                      Inject a factory for the short-lived object
                      – Ryan Pierce Williams
                      Nov 12 at 20:22











                      1














                      It sounds like you want to be able to both resolve objects from the container and then release them, all without directly referencing the container.



                      You can do that by having both a Create and a Release method in your factory interface.



                      public interface IFooFactory

                      Foo Create();
                      void Release(Foo created);



                      This allows you to hide references to the container within the implementation of IFooFactory.



                      You can create your own factory implementation, but for convenience some containers, like Windsor, will create the factory implementation for you.



                      var container = new WindsorContainer();
                      container.AddFacility<TypedFactoryFacility>();
                      container.Register(Component.For<Foo>());
                      container.Register(
                      Component.For<IFooFactory>()
                      .AsFactory()
                      );


                      You can inject the factory, call Create to obtain an instance of whatever the factory creates, and when you're done with it, pass that instance to the Release method.



                      Windsor does this by convention. The method names don't matter. If you call a method of the interface that returns something, it attempts to resolve it. If a method returns void and takes an argument then it tries to release the argument from the container.



                      Behind the scenes it's roughly the same as if you wrote this:



                      public class WindsorFooFactory : IFooFactory

                      private readonly IWindsorContainer _container;

                      public WindsorFooFactory(IWindsorContainer container)

                      _container = container;


                      public Foo Create()

                      return _container.Resolve<Foo>();


                      public void Release(Foo created)

                      _container.Release(created);




                      The factory implementation "knows" about the container, but that's okay. Its job is to create objects. The factory interface doesn't mention the container, so classes that depend on the interface aren't coupled to the container. You could create an entirely different implementation of the factory that doesn't use a container. If the object didn't need to be released you could have a Release method that does nothing.



                      So, in a nutshell, the factory interface is what enables you to follow the resolve/release part of the pattern without directly depending on the container.



                      Here's another example that shows a little bit more of what you can do with these abstract factories.






                      share|improve this answer






















                      • Mark Seeman has written a bunch of articles about Windsor, and it's a popular container, but for some reason it's not one of the containers he talks about in his book. He mentions Autofac, which does something similar with delegate factories, and it depends on the scope to ensure that what is resolved gets released.
                        – Scott Hannen
                        Nov 12 at 20:35










                      • As a matter of fact, Castle Windsor is discussed thoroughly in the first edition. In the second edition, however, we decided to remove the discussion of Castle Windsor (and other containers).
                        – Steven
                        Nov 13 at 16:00










                      • @Steven I only have the first edition. I did not realize that the second audition had two co-authors. My future references will cite the authors correctly. Thank you!
                        – Scott Hannen
                        Nov 13 at 16:36















                      1














                      It sounds like you want to be able to both resolve objects from the container and then release them, all without directly referencing the container.



                      You can do that by having both a Create and a Release method in your factory interface.



                      public interface IFooFactory

                      Foo Create();
                      void Release(Foo created);



                      This allows you to hide references to the container within the implementation of IFooFactory.



                      You can create your own factory implementation, but for convenience some containers, like Windsor, will create the factory implementation for you.



                      var container = new WindsorContainer();
                      container.AddFacility<TypedFactoryFacility>();
                      container.Register(Component.For<Foo>());
                      container.Register(
                      Component.For<IFooFactory>()
                      .AsFactory()
                      );


                      You can inject the factory, call Create to obtain an instance of whatever the factory creates, and when you're done with it, pass that instance to the Release method.



                      Windsor does this by convention. The method names don't matter. If you call a method of the interface that returns something, it attempts to resolve it. If a method returns void and takes an argument then it tries to release the argument from the container.



                      Behind the scenes it's roughly the same as if you wrote this:



                      public class WindsorFooFactory : IFooFactory

                      private readonly IWindsorContainer _container;

                      public WindsorFooFactory(IWindsorContainer container)

                      _container = container;


                      public Foo Create()

                      return _container.Resolve<Foo>();


                      public void Release(Foo created)

                      _container.Release(created);




                      The factory implementation "knows" about the container, but that's okay. Its job is to create objects. The factory interface doesn't mention the container, so classes that depend on the interface aren't coupled to the container. You could create an entirely different implementation of the factory that doesn't use a container. If the object didn't need to be released you could have a Release method that does nothing.



                      So, in a nutshell, the factory interface is what enables you to follow the resolve/release part of the pattern without directly depending on the container.



                      Here's another example that shows a little bit more of what you can do with these abstract factories.






                      share|improve this answer






















                      • Mark Seeman has written a bunch of articles about Windsor, and it's a popular container, but for some reason it's not one of the containers he talks about in his book. He mentions Autofac, which does something similar with delegate factories, and it depends on the scope to ensure that what is resolved gets released.
                        – Scott Hannen
                        Nov 12 at 20:35










                      • As a matter of fact, Castle Windsor is discussed thoroughly in the first edition. In the second edition, however, we decided to remove the discussion of Castle Windsor (and other containers).
                        – Steven
                        Nov 13 at 16:00










                      • @Steven I only have the first edition. I did not realize that the second audition had two co-authors. My future references will cite the authors correctly. Thank you!
                        – Scott Hannen
                        Nov 13 at 16:36













                      1












                      1








                      1






                      It sounds like you want to be able to both resolve objects from the container and then release them, all without directly referencing the container.



                      You can do that by having both a Create and a Release method in your factory interface.



                      public interface IFooFactory

                      Foo Create();
                      void Release(Foo created);



                      This allows you to hide references to the container within the implementation of IFooFactory.



                      You can create your own factory implementation, but for convenience some containers, like Windsor, will create the factory implementation for you.



                      var container = new WindsorContainer();
                      container.AddFacility<TypedFactoryFacility>();
                      container.Register(Component.For<Foo>());
                      container.Register(
                      Component.For<IFooFactory>()
                      .AsFactory()
                      );


                      You can inject the factory, call Create to obtain an instance of whatever the factory creates, and when you're done with it, pass that instance to the Release method.



                      Windsor does this by convention. The method names don't matter. If you call a method of the interface that returns something, it attempts to resolve it. If a method returns void and takes an argument then it tries to release the argument from the container.



                      Behind the scenes it's roughly the same as if you wrote this:



                      public class WindsorFooFactory : IFooFactory

                      private readonly IWindsorContainer _container;

                      public WindsorFooFactory(IWindsorContainer container)

                      _container = container;


                      public Foo Create()

                      return _container.Resolve<Foo>();


                      public void Release(Foo created)

                      _container.Release(created);




                      The factory implementation "knows" about the container, but that's okay. Its job is to create objects. The factory interface doesn't mention the container, so classes that depend on the interface aren't coupled to the container. You could create an entirely different implementation of the factory that doesn't use a container. If the object didn't need to be released you could have a Release method that does nothing.



                      So, in a nutshell, the factory interface is what enables you to follow the resolve/release part of the pattern without directly depending on the container.



                      Here's another example that shows a little bit more of what you can do with these abstract factories.






                      share|improve this answer














                      It sounds like you want to be able to both resolve objects from the container and then release them, all without directly referencing the container.



                      You can do that by having both a Create and a Release method in your factory interface.



                      public interface IFooFactory

                      Foo Create();
                      void Release(Foo created);



                      This allows you to hide references to the container within the implementation of IFooFactory.



                      You can create your own factory implementation, but for convenience some containers, like Windsor, will create the factory implementation for you.



                      var container = new WindsorContainer();
                      container.AddFacility<TypedFactoryFacility>();
                      container.Register(Component.For<Foo>());
                      container.Register(
                      Component.For<IFooFactory>()
                      .AsFactory()
                      );


                      You can inject the factory, call Create to obtain an instance of whatever the factory creates, and when you're done with it, pass that instance to the Release method.



                      Windsor does this by convention. The method names don't matter. If you call a method of the interface that returns something, it attempts to resolve it. If a method returns void and takes an argument then it tries to release the argument from the container.



                      Behind the scenes it's roughly the same as if you wrote this:



                      public class WindsorFooFactory : IFooFactory

                      private readonly IWindsorContainer _container;

                      public WindsorFooFactory(IWindsorContainer container)

                      _container = container;


                      public Foo Create()

                      return _container.Resolve<Foo>();


                      public void Release(Foo created)

                      _container.Release(created);




                      The factory implementation "knows" about the container, but that's okay. Its job is to create objects. The factory interface doesn't mention the container, so classes that depend on the interface aren't coupled to the container. You could create an entirely different implementation of the factory that doesn't use a container. If the object didn't need to be released you could have a Release method that does nothing.



                      So, in a nutshell, the factory interface is what enables you to follow the resolve/release part of the pattern without directly depending on the container.



                      Here's another example that shows a little bit more of what you can do with these abstract factories.







                      share|improve this answer














                      share|improve this answer



                      share|improve this answer








                      edited Nov 12 at 20:28

























                      answered Nov 12 at 20:20









                      Scott Hannen

                      12.6k1425




                      12.6k1425











                      • Mark Seeman has written a bunch of articles about Windsor, and it's a popular container, but for some reason it's not one of the containers he talks about in his book. He mentions Autofac, which does something similar with delegate factories, and it depends on the scope to ensure that what is resolved gets released.
                        – Scott Hannen
                        Nov 12 at 20:35










                      • As a matter of fact, Castle Windsor is discussed thoroughly in the first edition. In the second edition, however, we decided to remove the discussion of Castle Windsor (and other containers).
                        – Steven
                        Nov 13 at 16:00










                      • @Steven I only have the first edition. I did not realize that the second audition had two co-authors. My future references will cite the authors correctly. Thank you!
                        – Scott Hannen
                        Nov 13 at 16:36
















                      • Mark Seeman has written a bunch of articles about Windsor, and it's a popular container, but for some reason it's not one of the containers he talks about in his book. He mentions Autofac, which does something similar with delegate factories, and it depends on the scope to ensure that what is resolved gets released.
                        – Scott Hannen
                        Nov 12 at 20:35










                      • As a matter of fact, Castle Windsor is discussed thoroughly in the first edition. In the second edition, however, we decided to remove the discussion of Castle Windsor (and other containers).
                        – Steven
                        Nov 13 at 16:00










                      • @Steven I only have the first edition. I did not realize that the second audition had two co-authors. My future references will cite the authors correctly. Thank you!
                        – Scott Hannen
                        Nov 13 at 16:36















                      Mark Seeman has written a bunch of articles about Windsor, and it's a popular container, but for some reason it's not one of the containers he talks about in his book. He mentions Autofac, which does something similar with delegate factories, and it depends on the scope to ensure that what is resolved gets released.
                      – Scott Hannen
                      Nov 12 at 20:35




                      Mark Seeman has written a bunch of articles about Windsor, and it's a popular container, but for some reason it's not one of the containers he talks about in his book. He mentions Autofac, which does something similar with delegate factories, and it depends on the scope to ensure that what is resolved gets released.
                      – Scott Hannen
                      Nov 12 at 20:35












                      As a matter of fact, Castle Windsor is discussed thoroughly in the first edition. In the second edition, however, we decided to remove the discussion of Castle Windsor (and other containers).
                      – Steven
                      Nov 13 at 16:00




                      As a matter of fact, Castle Windsor is discussed thoroughly in the first edition. In the second edition, however, we decided to remove the discussion of Castle Windsor (and other containers).
                      – Steven
                      Nov 13 at 16:00












                      @Steven I only have the first edition. I did not realize that the second audition had two co-authors. My future references will cite the authors correctly. Thank you!
                      – Scott Hannen
                      Nov 13 at 16:36




                      @Steven I only have the first edition. I did not realize that the second audition had two co-authors. My future references will cite the authors correctly. Thank you!
                      – Scott Hannen
                      Nov 13 at 16:36











                      1














                      Autofac uses Func<> as the factory pattern so you could always do the same:



                      public class Foo()

                      private readonly Func<Bar> _barFactory;

                      public Foo(Func<Bar> barFactory)

                      _barFactory = barFactory;




                      Adding Factory Interfaces for factories is not something I think anyone should need to do most of the time, it's extra work for little to no reward.



                      Then you simply need to keep track of which entities are externally owned or DI owned for your release (Dispose in C#).






                      share|improve this answer

























                        1














                        Autofac uses Func<> as the factory pattern so you could always do the same:



                        public class Foo()

                        private readonly Func<Bar> _barFactory;

                        public Foo(Func<Bar> barFactory)

                        _barFactory = barFactory;




                        Adding Factory Interfaces for factories is not something I think anyone should need to do most of the time, it's extra work for little to no reward.



                        Then you simply need to keep track of which entities are externally owned or DI owned for your release (Dispose in C#).






                        share|improve this answer























                          1












                          1








                          1






                          Autofac uses Func<> as the factory pattern so you could always do the same:



                          public class Foo()

                          private readonly Func<Bar> _barFactory;

                          public Foo(Func<Bar> barFactory)

                          _barFactory = barFactory;




                          Adding Factory Interfaces for factories is not something I think anyone should need to do most of the time, it's extra work for little to no reward.



                          Then you simply need to keep track of which entities are externally owned or DI owned for your release (Dispose in C#).






                          share|improve this answer












                          Autofac uses Func<> as the factory pattern so you could always do the same:



                          public class Foo()

                          private readonly Func<Bar> _barFactory;

                          public Foo(Func<Bar> barFactory)

                          _barFactory = barFactory;




                          Adding Factory Interfaces for factories is not something I think anyone should need to do most of the time, it's extra work for little to no reward.



                          Then you simply need to keep track of which entities are externally owned or DI owned for your release (Dispose in C#).







                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Nov 12 at 20:29









                          Erik Philips

                          40k689123




                          40k689123



























                              draft saved

                              draft discarded
















































                              Thanks for contributing an answer to Stack Overflow!


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid


                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.

                              To learn more, see our tips on writing great answers.





                              Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                              Please pay close attention to the following guidance:


                              • Please be sure to answer the question. Provide details and share your research!

                              But avoid


                              • Asking for help, clarification, or responding to other answers.

                              • Making statements based on opinion; back them up with references or personal experience.

                              To learn more, see our tips on writing great answers.




                              draft saved


                              draft discarded














                              StackExchange.ready(
                              function ()
                              StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53268326%2fregister-resolve-release-pattern-usage%23new-answer', 'question_page');

                              );

                              Post as a guest















                              Required, but never shown





















































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown

































                              Required, but never shown














                              Required, but never shown












                              Required, but never shown







                              Required, but never shown







                              Popular posts from this blog

                              Top Tejano songwriter Luis Silva dead of heart attack at 64

                              ReactJS Fetched API data displays live - need Data displayed static

                              Evgeni Malkin