Should I Dispose instances that are not Owned?
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
add a comment |
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
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
add a comment |
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
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
c# dependency-injection autofac
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
add a comment |
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
add a comment |
1 Answer
1
active
oldest
votes
Why not just use Func<DbContext> dbcFactory
like shown in your code sample?
You shouldn't do that, for two reasons.
- It is the container's job to dispose of it - so let it do
its job. - 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.
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Why not just use Func<DbContext> dbcFactory
like shown in your code sample?
You shouldn't do that, for two reasons.
- It is the container's job to dispose of it - so let it do
its job. - 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.
add a comment |
Why not just use Func<DbContext> dbcFactory
like shown in your code sample?
You shouldn't do that, for two reasons.
- It is the container's job to dispose of it - so let it do
its job. - 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.
add a comment |
Why not just use Func<DbContext> dbcFactory
like shown in your code sample?
You shouldn't do that, for two reasons.
- It is the container's job to dispose of it - so let it do
its job. - 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.
Why not just use Func<DbContext> dbcFactory
like shown in your code sample?
You shouldn't do that, for two reasons.
- It is the container's job to dispose of it - so let it do
its job. - 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.
answered Nov 14 '18 at 7:05
mjwillsmjwills
15.1k42439
15.1k42439
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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