How will this example affect the using implementation in GetSite?
public abstract class SPSiteBase
{
protected abstract string Url { get; set; }
public abstract SPSite GetSite(string url = null);
}
public class SPSiteFactory : SPSiteBase
{
protected override sealed string Url { get; set; }
public override SPSite GetSite(string url = null)
{
using (SPSite site = new SPSite(string.IsNullOrEmpty(url) ? Url : url))
{
return site;
}
}
public SPSiteFactory() { }
public SPSiteFactory(string url)
{
Url = url;
}
}
I call it like this
SPSiteFactory siteFactory = new SPSiteFactory("http://portalurl/");
SPSite site = siteFactory.GetSite();
I've noticed that the code steps out of the using after I run the siteFactory.GetSite()
method but will the site
ever be disposed?
1 Answer 1
No, you can't use a factory to dispose your objects, your code is creating and immediately disposing the SPSite as soon as it steps out of your method.
public override SPSite GetSite(string url = null)
{
return new SPSite(string.IsNullOrEmpty(url) ? Url : url))
}
Have the disposing be handled by the calling code. You can't handle the disposing from a factory method.
If you want to check it out, build your own disposable type, put a breakpoint in the Dispose method and check for yourself.
-
\$\begingroup\$ That would make returning disposable variables by using
using
in a factory pattern to an antipattern, that's all I needed, thanks! \$\endgroup\$Eric Herlitz– Eric Herlitz2014年01月03日 22:43:55 +00:00Commented Jan 3, 2014 at 22:43 -
2\$\begingroup\$ @EricHerlitz I wouldn't say it's an anti-pattern. Anti-pattern is something that works, but is bad design. This code simply doesn't work, it returns an object that's already disposed. \$\endgroup\$svick– svick2014年01月05日 22:59:09 +00:00Commented Jan 5, 2014 at 22:59
-
\$\begingroup\$ The instance of
site
still works but the site in the factory is disposed \$\endgroup\$Eric Herlitz– Eric Herlitz2014年01月06日 08:12:55 +00:00Commented Jan 6, 2014 at 8:12
Explore related questions
See similar questions with these tags.
using { return }
is the same astry { return }
—it won't magically handle errors the calling code. Thususing
will dispose right away. \$\endgroup\$