Should I Dispose instances that are not Owned?












0















I'm using Autofac in a project, and I'm trying to do it right.
So I've been reading the documentation and found Owned<T>. It seems like it's the right relationship type to use when i want to dispose something by myself - e.g. a DbContext which is disposable.



So I changed all my injected factories Func<DbContext> to Func<Owned<DbContext>>.



The only thing is it feels a little dirty the Lazy<T> like behaviour and to put the Owned in the using and depending on a non framework type...



Is it wrong to not use Owned at all?



Is there an issue in disposing instances that are not owned by my class like this?



public class MyClass
{
private readonly Func<DbContext> _dbcFactory;

private MyClass(Func<DbContext> dbcFactory)
{
_dbcFactory = dbcFactory; // nullcheck etc;
}
private void TheMethodWhoUpdate(String newName)
{
using(var dbc = _dbcFactory())
{
var ent = dbc.Table.Single(x => x.id == 3);

end.Name = newName;
dbc.SaveChanges();
}
}
}


What I was able to imagine (because I can't find a clue on the docs) is that this could lead to some performance issue, because maybe autofac will track that created DbContext instance and try to dispose it again, losing some amount of time (probably very small)... But maybe I'm wrong, and I should stick to the guide.










share|improve this question

























  • Possible duplicate of Func<Owned<T>> vs Func<T> dependency

    – mjwills
    Nov 14 '18 at 7:05











  • The real question is: why do you want to manage the lifetime yourself?

    – Steven
    Nov 14 '18 at 13:06











  • Because sometimes it's needed. This is a big old project I'm migrating, so I need to change as less code as possible, and I need to free resources as fast as possible.

    – L.Trabacchin
    Nov 14 '18 at 13:33
















0















I'm using Autofac in a project, and I'm trying to do it right.
So I've been reading the documentation and found Owned<T>. It seems like it's the right relationship type to use when i want to dispose something by myself - e.g. a DbContext which is disposable.



So I changed all my injected factories Func<DbContext> to Func<Owned<DbContext>>.



The only thing is it feels a little dirty the Lazy<T> like behaviour and to put the Owned in the using and depending on a non framework type...



Is it wrong to not use Owned at all?



Is there an issue in disposing instances that are not owned by my class like this?



public class MyClass
{
private readonly Func<DbContext> _dbcFactory;

private MyClass(Func<DbContext> dbcFactory)
{
_dbcFactory = dbcFactory; // nullcheck etc;
}
private void TheMethodWhoUpdate(String newName)
{
using(var dbc = _dbcFactory())
{
var ent = dbc.Table.Single(x => x.id == 3);

end.Name = newName;
dbc.SaveChanges();
}
}
}


What I was able to imagine (because I can't find a clue on the docs) is that this could lead to some performance issue, because maybe autofac will track that created DbContext instance and try to dispose it again, losing some amount of time (probably very small)... But maybe I'm wrong, and I should stick to the guide.










share|improve this question

























  • Possible duplicate of Func<Owned<T>> vs Func<T> dependency

    – mjwills
    Nov 14 '18 at 7:05











  • The real question is: why do you want to manage the lifetime yourself?

    – Steven
    Nov 14 '18 at 13:06











  • Because sometimes it's needed. This is a big old project I'm migrating, so I need to change as less code as possible, and I need to free resources as fast as possible.

    – L.Trabacchin
    Nov 14 '18 at 13:33














0












0








0








I'm using Autofac in a project, and I'm trying to do it right.
So I've been reading the documentation and found Owned<T>. It seems like it's the right relationship type to use when i want to dispose something by myself - e.g. a DbContext which is disposable.



So I changed all my injected factories Func<DbContext> to Func<Owned<DbContext>>.



The only thing is it feels a little dirty the Lazy<T> like behaviour and to put the Owned in the using and depending on a non framework type...



Is it wrong to not use Owned at all?



Is there an issue in disposing instances that are not owned by my class like this?



public class MyClass
{
private readonly Func<DbContext> _dbcFactory;

private MyClass(Func<DbContext> dbcFactory)
{
_dbcFactory = dbcFactory; // nullcheck etc;
}
private void TheMethodWhoUpdate(String newName)
{
using(var dbc = _dbcFactory())
{
var ent = dbc.Table.Single(x => x.id == 3);

end.Name = newName;
dbc.SaveChanges();
}
}
}


What I was able to imagine (because I can't find a clue on the docs) is that this could lead to some performance issue, because maybe autofac will track that created DbContext instance and try to dispose it again, losing some amount of time (probably very small)... But maybe I'm wrong, and I should stick to the guide.










share|improve this question
















I'm using Autofac in a project, and I'm trying to do it right.
So I've been reading the documentation and found Owned<T>. It seems like it's the right relationship type to use when i want to dispose something by myself - e.g. a DbContext which is disposable.



So I changed all my injected factories Func<DbContext> to Func<Owned<DbContext>>.



The only thing is it feels a little dirty the Lazy<T> like behaviour and to put the Owned in the using and depending on a non framework type...



Is it wrong to not use Owned at all?



Is there an issue in disposing instances that are not owned by my class like this?



public class MyClass
{
private readonly Func<DbContext> _dbcFactory;

private MyClass(Func<DbContext> dbcFactory)
{
_dbcFactory = dbcFactory; // nullcheck etc;
}
private void TheMethodWhoUpdate(String newName)
{
using(var dbc = _dbcFactory())
{
var ent = dbc.Table.Single(x => x.id == 3);

end.Name = newName;
dbc.SaveChanges();
}
}
}


What I was able to imagine (because I can't find a clue on the docs) is that this could lead to some performance issue, because maybe autofac will track that created DbContext instance and try to dispose it again, losing some amount of time (probably very small)... But maybe I'm wrong, and I should stick to the guide.







c# dependency-injection autofac






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 14 '18 at 7:21







L.Trabacchin

















asked Nov 14 '18 at 0:27









L.TrabacchinL.Trabacchin

672824




672824













  • Possible duplicate of Func<Owned<T>> vs Func<T> dependency

    – mjwills
    Nov 14 '18 at 7:05











  • The real question is: why do you want to manage the lifetime yourself?

    – Steven
    Nov 14 '18 at 13:06











  • Because sometimes it's needed. This is a big old project I'm migrating, so I need to change as less code as possible, and I need to free resources as fast as possible.

    – L.Trabacchin
    Nov 14 '18 at 13:33



















  • Possible duplicate of Func<Owned<T>> vs Func<T> dependency

    – mjwills
    Nov 14 '18 at 7:05











  • The real question is: why do you want to manage the lifetime yourself?

    – Steven
    Nov 14 '18 at 13:06











  • Because sometimes it's needed. This is a big old project I'm migrating, so I need to change as less code as possible, and I need to free resources as fast as possible.

    – L.Trabacchin
    Nov 14 '18 at 13:33

















Possible duplicate of Func<Owned<T>> vs Func<T> dependency

– mjwills
Nov 14 '18 at 7:05





Possible duplicate of Func<Owned<T>> vs Func<T> dependency

– mjwills
Nov 14 '18 at 7:05













The real question is: why do you want to manage the lifetime yourself?

– Steven
Nov 14 '18 at 13:06





The real question is: why do you want to manage the lifetime yourself?

– Steven
Nov 14 '18 at 13:06













Because sometimes it's needed. This is a big old project I'm migrating, so I need to change as less code as possible, and I need to free resources as fast as possible.

– L.Trabacchin
Nov 14 '18 at 13:33





Because sometimes it's needed. This is a big old project I'm migrating, so I need to change as less code as possible, and I need to free resources as fast as possible.

– L.Trabacchin
Nov 14 '18 at 13:33












1 Answer
1






active

oldest

votes


















1














Why not just use Func<DbContext> dbcFactory like shown in your code sample?



You shouldn't do that, for two reasons.




  1. It is the container's job to dispose of it - so let it do
    its job.

  2. Secondly, if you register that DbContext as
    InstancePerLifetimeScope then multiple objects (involved in the
    same lifetime scope) will get the same instance of the
    DbContext - which is problematic if one of them disposes it out
    from under the other one.






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%2f53291446%2fshould-i-dispose-instances-that-are-not-owned%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1














    Why not just use Func<DbContext> dbcFactory like shown in your code sample?



    You shouldn't do that, for two reasons.




    1. It is the container's job to dispose of it - so let it do
      its job.

    2. Secondly, if you register that DbContext as
      InstancePerLifetimeScope then multiple objects (involved in the
      same lifetime scope) will get the same instance of the
      DbContext - which is problematic if one of them disposes it out
      from under the other one.






    share|improve this answer




























      1














      Why not just use Func<DbContext> dbcFactory like shown in your code sample?



      You shouldn't do that, for two reasons.




      1. It is the container's job to dispose of it - so let it do
        its job.

      2. Secondly, if you register that DbContext as
        InstancePerLifetimeScope then multiple objects (involved in the
        same lifetime scope) will get the same instance of the
        DbContext - which is problematic if one of them disposes it out
        from under the other one.






      share|improve this answer


























        1












        1








        1







        Why not just use Func<DbContext> dbcFactory like shown in your code sample?



        You shouldn't do that, for two reasons.




        1. It is the container's job to dispose of it - so let it do
          its job.

        2. Secondly, if you register that DbContext as
          InstancePerLifetimeScope then multiple objects (involved in the
          same lifetime scope) will get the same instance of the
          DbContext - which is problematic if one of them disposes it out
          from under the other one.






        share|improve this answer













        Why not just use Func<DbContext> dbcFactory like shown in your code sample?



        You shouldn't do that, for two reasons.




        1. It is the container's job to dispose of it - so let it do
          its job.

        2. Secondly, if you register that DbContext as
          InstancePerLifetimeScope then multiple objects (involved in the
          same lifetime scope) will get the same instance of the
          DbContext - which is problematic if one of them disposes it out
          from under the other one.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 14 '18 at 7:05









        mjwillsmjwills

        15.1k42439




        15.1k42439






























            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.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53291446%2fshould-i-dispose-instances-that-are-not-owned%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

            Xamarin.iOS Cant Deploy on Iphone

            Glorious Revolution

            Dulmage-Mendelsohn matrix decomposition in Python